信号量 Semaphore
对于有限资源的释放和创建,这个信号量真的方便的不要不要的。
举个栗子
举个例子:我们都知道去旅游女生厕所的故事吧,人山人海的。假设这个厕所坑位也就5个,外面的小姑娘,大妈,几十个在跺脚。这就用到了 Semaphore ,资源就是 5个坑。来一个人消费一个资源,出来释放这个资源。
public class Toilet {private final Semaphore semaphore;private final int permits;public Toilet(int permits) {this.semaphore = new Semaphore(permits);this.permits = permits;}public void useToilet() {try {semaphore.acquire();Thread.sleep(300);System.out.println(Thread.currentThread().getName()+"占到茅坑了 被占坑位" + (permits - semaphore.availablePermits()));} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();}}}
public class UserThread extends Thread {private final Toilet toilet;public UserThread(Toilet toilet) {this.toilet = toilet;}@Overridepublic void run() {super.run();try {while (true) {toilet.useToilet();Thread.sleep(2000);}} catch (InterruptedException e) {e.printStackTrace();}}}
public class Main {public static void main(String[] args) {Toilet toilet = new Toilet(5);UserThread userThread1 = new UserThread(toilet);UserThread userThread2 = new UserThread(toilet);UserThread userThread3 = new UserThread(toilet);UserThread userThread4 = new UserThread(toilet);UserThread userThread5 = new UserThread(toilet);UserThread userThread6 = new UserThread(toilet);UserThread userThread7 = new UserThread(toilet);userThread1.start();userThread2.start();userThread3.start();userThread4.start();userThread5.start();userThread6.start();userThread7.start();}

如何自己实现 Semaphore
原理图是抄来的。
就是一个计数器,一个等待队列,三个方法。
采用 CAS 进行计数写入。
俗话说原理很简单,但是实现起来真的超级恶心,我就先不分析了,感兴趣的可以自己了解下。等我完成这个系列后,在回头分析这个。万分抱歉,如果我忘记了,记得提醒我。
http://ifeve.com/introduce-abstractqueuedsynchronizer/
https://blog.csdn.net/buyaoxx/article/details/77935730
