Semaphore 信号量
控制同时访问资源的线程数量,类似于令牌桶。基于aqs实现
关键用法
Semaphore semaphore = new Semaphore(3,true);
semaphore.acquire();//子线程开始前调用
semaphore.release();//同一个子线程结束后调用
CountDownLatch
等待其它线程执行完以后再执行。基于aqs实现
ConutDownLatch latch = new CountDownLatch();
latch.countDown();//子线程执行结束后调用
latch.await();//主线程
CyclicBarrier 回环栅栏
多个线程等到某个状态后同时执行。基于ReentrantLock+Condition实现。
CyclicBarrier barrier = new CyclicBarrier(5);
barrier.await();//子线程开始前调用
Exchanger
数据交换,用于线程间的通信。共享变量node,基于cas+park/unpark
Exchanger exchanger = new Exchanger();
exchanger.exchange(...);//交换数据的多个线程调用
Phaser
jdk1.7后开始提供,可用来取代CountDownLatch和CyclicBarrier
Phaser phaser = new Phaser(2);
//取代CountDownLatch方法
phaser.arrive();
phaser.awaitAdvance(phaser.getphase());
//取代CyclicBarrier方法
phaser.awaitAdvance(0);
新特性
1、动态调整线程个数
2、内部采取树状存储,父节点对子节点无感知,子节点维护父节点