类型 | 并发特性 | 其他 |
---|---|---|
CountDownLatch | 一般用于某个线程 A 等待若干个其他线程执行完任务之后,它才执行 | 不可复用 |
CyclicBarrier | 般用于一组线程互相等待至某个状态,然后这一组线程再同时执行 | 可复用;方法更多 |
Semaphore | 流控(资源并发控制) | |
Exchanger | 用于线程间协作的工具类,用于两个线程间能够交换 | |
Phaser | 移相器 线程之前的动作协调,同步 | 很灵活,底层非AQS,内部实现比较复杂 |
Phaser
Phaser的灵活性主要体现在在构造函数时不需要强制指定目前有多少参与协作的线程,可以在运行时动态改变。
register()//添加一个新的注册者
bulkRegister(int parties)//添加指定数量的多个注册者
arrive()// 到达栅栏点直接执行,无须等待其他的线程
arriveAndAwaitAdvance()//到达栅栏点,必须等待其他所有注册者到达
arriveAndDeregister()//到达栅栏点,注销自己无须等待其他的注册者到达
onAdvance(int phase, int registeredParties)//多个线程达到注册点之后,会调用该方法。
(1)替代CountDownLatch实现一次性的共享锁例子
1 | void runTasks(List<Runnable> tasks) { |
(2)模拟CyclicBarrier的例子。
1 | package concurrent.tools.phaser; |