CountDownLatch
CountDownLatch是一个计数器 ,可以线程安全的进行latch.countDown();当count减为0时,latch.await();方法停止阻塞。线程完成一个记录一个,计数器递减,只能只用一次
demo
ublic class Parallellimit {public static void main(String[] args) {ExecutorService pool = Executors.newCachedThreadPool();CountDownLatch cdl = new CountDownLatch(100);for (int i = 0; i < 100; i++) {CountRunnable runnable = new CountRunnable(cdl);pool.execute(runnable);}}}class CountRunnable implements Runnable {private CountDownLatch countDownLatch;public CountRunnable(CountDownLatch countDownLatch) {this.countDownLatch = countDownLatch;}@Overridepublic void run() {try {synchronized (countDownLatch) {countDownLatch.countDown();System.out.println("thread counts = " + (countDownLatch.getCount()));}countDownLatch.await();System.out.println("concurrency counts = " + (100 - countDownLatch.getCount()));} catch (InterruptedException e) {e.printStackTrace();}}}
源码
CountDownLatch使用内部类Sync继承aqs来保证线程安全
private static final class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 4982264981922014374L;
Sync(int count) {
this.setState(count);
}
int getCount() {
return this.getState();
}
protected int tryAcquireShared(int acquires) {
return this.getState() == 0 ? 1 : -1;
}
protected boolean tryReleaseShared(int releases) {
int c;
int nextc;
do {
c = this.getState();
if (c == 0) {
return false;
}
nextc = c - 1;
} while(!this.compareAndSetState(c, nextc));
return nextc == 0;
}
}
