一,Semaphore – 计数信号
从概念上讲,信号量维护了一个许可集。在访问某有限资源前,通过 acquire() 获取许可,若许可均已用尽,则线程阻塞。而 release() 则释放一个许可,从而可能释放一个正在阻塞的获取者。
Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。
参看 Java API 的代码示例。
构造方法:
Semaphore(int permits)
创建具有给定的许可数和非公平的公平设置的 Semaphore。当 permits = 1,则可用作互斥锁。
Semaphore(int permits, boolean fair)
创建具有给定的许可数和给定的公平设置的 Semaphore。
主要方法:
void acquire()
获取一个许可,在得到一个许可前线程将一直阻塞,否则线程被中断。
void release()
释放一个许可,将其返回给信号量。
二,CyclicBarrier
CyclicBarrier 允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
CyclicBarrier(其构造方法)支持一个可选的 Runnable 命令(即屏障操作),在这组线程中的最后一个线程到达之后(但在释放所有线程之前),该 Runnable 只在这个屏障点运行一次。
构造方法:
CyclicBarrier(int parties)
创建一个新的 CyclicBarrier。
CyclicBarrier(int parties, Runnable barrierAction)
创建一个新的 CyclicBarrier。barrierAction 即上面提及的屏障操作(Runnable),该操作由最后一个进入 barrier 的线程执行。
主要方法:
int await()
一直等待,直到所有参与者都已经在此 barrier 上调用了 await 方法。
int await(long timeout, TimeUnit unit)
一直等待,直到所有参与者都已经在此屏障上调用了 await 方法之前, 或者超出了指定的等待时间。
三,CountDownLatch
通过 countDown() 方法使得计数递减,在计数到达零之前,await 方法会一直受阻塞。在计数递减至零后,会释放所有等待的线程,即 await 的所有后续调用都将立即执行。计数无法被重置。
常见的用法是,主线程创建一个初始计数为 N 的 countdown latch,然后创建 N 个线程去分解完成整个任务,每个任务在完成后将计数递减,最终 N 个线程执行完毕后,计数递减为 0, 主线程的 await() 方法的后续操作因此继续得以执行。
构造方法:
CountDownLatch(int count)
构造一个 CountDownLatch,count为初始计数。
主要方法:
await()
使当前线程在锁存器倒计数至零之前一直等待。
countDown()
递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
四,Exchanger
使得两个线程可以彼此交换数据。两个线程都需要调用 v exchange(v) 方法,该方法的参数 v 是当前线程所持有并要交换给另一线程的数据,而返回的 v 则是从另一线程处获取的。
主要方法:
exchange(V x)
等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
五,Phaser
。