信号量 Semaphore

对于有限资源的释放和创建,这个信号量真的方便的不要不要的。

举个栗子

举个例子:我们都知道去旅游女生厕所的故事吧,人山人海的。假设这个厕所坑位也就5个,外面的小姑娘,大妈,几十个在跺脚。这就用到了 Semaphore ,资源就是 5个坑。来一个人消费一个资源,出来释放这个资源。

  1. public class Toilet {
  2. private final Semaphore semaphore;
  3. private final int permits;
  4. public Toilet(int permits) {
  5. this.semaphore = new Semaphore(permits);
  6. this.permits = permits;
  7. }
  8. public void useToilet() {
  9. try {
  10. semaphore.acquire();
  11. Thread.sleep(300);
  12. System.out.println(Thread.currentThread().getName()+"占到茅坑了 被占坑位" + (permits - semaphore.availablePermits()));
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. } finally {
  16. semaphore.release();
  17. }
  18. }
  19. }
  1. public class UserThread extends Thread {
  2. private final Toilet toilet;
  3. public UserThread(Toilet toilet) {
  4. this.toilet = toilet;
  5. }
  6. @Override
  7. public void run() {
  8. super.run();
  9. try {
  10. while (true) {
  11. toilet.useToilet();
  12. Thread.sleep(2000);
  13. }
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. }
  1. public class Main {
  2. public static void main(String[] args) {
  3. Toilet toilet = new Toilet(5);
  4. UserThread userThread1 = new UserThread(toilet);
  5. UserThread userThread2 = new UserThread(toilet);
  6. UserThread userThread3 = new UserThread(toilet);
  7. UserThread userThread4 = new UserThread(toilet);
  8. UserThread userThread5 = new UserThread(toilet);
  9. UserThread userThread6 = new UserThread(toilet);
  10. UserThread userThread7 = new UserThread(toilet);
  11. userThread1.start();
  12. userThread2.start();
  13. userThread3.start();
  14. userThread4.start();
  15. userThread5.start();
  16. userThread6.start();
  17. userThread7.start();
  18. }

image.png

如何自己实现 Semaphore

原理图是抄来的。
image.png
就是一个计数器,一个等待队列,三个方法。
采用 CAS 进行计数写入。

俗话说原理很简单,但是实现起来真的超级恶心,我就先不分析了,感兴趣的可以自己了解下。等我完成这个系列后,在回头分析这个。万分抱歉,如果我忘记了,记得提醒我。

http://ifeve.com/introduce-abstractqueuedsynchronizer/
https://blog.csdn.net/buyaoxx/article/details/77935730