计数信号量(Semaphore)
用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。计数信号量还可以用来实现某种资源池,或者对容器施加边界。
Semaphore管理一组虚拟的许可,许可的初始数量可以通过构造函数指定。当有剩余许可时,执行的操作要首先获得许可,并且使用以后要归还许可。如果没有剩余的许可,获取许可的acquire操作将阻塞直到有许可。release方法释放一个许可。
Semaphore可以用于实现资源池,也可以让任何一种容器变成有界阻塞容器。
Semaphore基于AQS框架实现,AQS可以参考AbstractQueuedSynchronizer(AQS)——Java中同步类的基类
栅栏(CyclicBarrier)
所有线程必须同时到达栅栏,才能继续执行。await用于等待其他线程。CyclicBarrier可以让一定数量的线程反复在栅栏位置汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达了栅栏位置,那么栅栏将打开,此时所有线程都被释放,而栅栏将被重置以便下次使用。如果await调用超时,或者await阻塞的线程被中断,那么栅栏就被认为打破了。
CyclicBarrier使用ReentrantLock锁和Condition信号控制线程。构造函数CyclicBarrier(int parties, Runnable barrierAction)将一个栅栏操作传给构造函数,当所有线程达到栅栏时会执行这个barrierAction,由最后一个达到的线程执行,然后然后nextGeneration方法唤醒释放所有的线程并且生成下一代。源代码如下:如果所有线程全部到达栅栏,最后到达的线程执行barrierAction,最后唤醒释放所有线程。
闭锁(CountDownLatch)
CountDownLatch可以使一个或多个线程等待一组事件发生。CountDownLatch状态包括一个计数器,该计数器被初始化为一个正数,表示需要等待的事件数量。countDown方法递减计数器,表示有一个事件已经发生了,而await方法等待计数器达到零。
CountDownLatch也是基于AQS框架实现的。CountDownLatch用于等待一个或多个事件发生。
网友评论