-
CountDownLatch
一组线程等待其他的线程完成工作以后在执行;
await方法用来等待,countDown方法负责计数器的减一;
计数器必须大于等于0,只是等于0的时候,计数器就是零,调用await方法时不会阻塞当前线程;CountDownLatch不可能重新初始化或修改CountDownLatch对象的内部计数器的值;
-
CyclicBarrier
CyclicBarrier的字面意思是可循环使用的屏障;它要做的事情是,让一组线程到达一个屏障时被阻塞,直至最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行;
CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier已经到达屏障,然后当前线程阻塞;
CyclicBarrier(int parties, Runnable barrierAction),屏障开放,barrierAction定义的任务会执行;
-
CountDownLatch和CyclicBarrier区别
CountdownLatch放行由外部调用countDown次数控制,CyclicBarrier放行由一组线程内部控制(调用await(方法))
CountDownLatch的计数器只能使用一次,而CyclicBarrier得计数器可以使用reset()方法重置,CyclicBarrier可处理更复杂得业务场景;
-
Semaphore
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源;
Semaphore的构造方法Semaphore(int permits) 接受一个整型数字,表示可用的许可证数量;Semaphore(10)表示允许10个线程获取许可证,也就是最大并发数为10;acquire()方法获取一个许可证,如果当前没有可用的许可证,则会阻塞直到有可用的许可证为止;tryAcquire()方法是尝试获取许可证,不会阻塞;
-
Exchanger
Exchanger是一个用于线程间协作的工具类,用于进行线程间的数据交换;它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据,这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange()方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将生产出来的数据传递给对方;