参考链接:
http://ifeve.com/concurrency-exchanger/
http://ifeve.com/concurrency-semaphore/
https://www.cnblogs.com/nullzx/p/5270233.html
Semaphore
概念:用来控制并发线程数,好比当前道路只能容纳100辆车,未到达100的时候,就可以进去,到了100的话,就进不去了,除非进去的车再出去,那么后面的才可以继续进入。这里面车相当于线程,出去的车相当于线程执行完毕,看见红灯的车相当于阻塞队列中的任务,在道路里面的车相当于正在执行的线程。
基于底层的原理:
AQS(AbstractQueuedSynchronizer)实现线程的管理。Semaphore有两个构造函数,参数permits表示许可数,它最后传递给了AQS的state值。线程在运行时首先获取许可,如果成功,许可数就减1,线程运行,当线程运行结束就释放许可,许可数就加1。如果许可数为0,则获取失败,线程位于AQS的等待队列中,它会被其它释放许可的线程唤醒。
这里修改许可数都是通过CAS进行交换。
Exchanger
说白了就是两个线程到了一个同步点才能互相交换数据。