并发编程(二)CountDownLatch、CyclicBarrier、Semaphore
CountDownLatch
是一个线程同步工具类,允许一个或多个线程一直等待,直到其他线程完成工作。其核心是一个计数器,仅允许初始化时设定值,调用await()方法并在这个方法上阻塞,其余线程持有引用,调用countdown()方法使得count减一,count为零时阻塞线程继续执行。
CyclicBarrier
循环栅栏,声明需要到达的阻塞线程数量,线程调用await()方法阻塞,当阻塞线程达到声明数量时,阻塞线程继续执行。适用于需要阶段性汇总的场景,可以反复使用(Cyclic),而且可以reset阻塞线程数量声明,比CountDownLatch更灵活,适用于更加复杂的场景。
Semaphore
信号量,构造函数声明允许的线程数量,线程持有其引用,通过acquire()获取信号量,通过release()释放信号量。保持运行的线程数量恒定。
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
for (int i = 1; i <= 6; i++) {
int temp = i;
new Thread(()->{
try {
semaphore.acquire();
System.out.println(temp + "号车进来了");
Thread.sleep(new Random().nextInt(5000));
semaphore.release();
System.out.println(temp + "号车出去了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}

浙公网安备 33010602011771号