java.util.concurrent - 同步工具类

本文深入解析了CountDownLatch、CyclicBarrier、Semaphore和Exchanger等线程同步工具的原理及应用,探讨了它们如何帮助解决多线程环境下的同步问题,实现线程间的高效协作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1CountDownLatch的解释  http://www.importnew.com/15731.html

在jdk1.5出现的类,它能够使一个线程等待其它线程完成工作后再执行,换句话说,就是一个线程执行的前提是某些线程必须执行完毕,此时就可以使用CountDownLatch。

CountDownLatch通过一个计数器实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,便调用countDown()方法,将计数器的值减1。当计数器的值减为0时,表示所有的线程已经执行完,此时在闭锁上等待的线程可以恢复执行任务。

2CountDownLatch的应用

实现最大程度的并行性:在想要同时启动多个线程时,可以将CountDownLatch的计数器设置为1,多个线程同时等待await(),然后将计数器减1,这样可以做到多个线程最大程度的并行执行。

等待某些任务的完成

3CyclicBarrier的解释

同步屏障,它的作用是让一组线程都到达就绪状态,同时争抢执行权,达到线程之间竞争公平的目的。

在初始化时,指定线程数,每当一个线程就绪后,调用一次await()方法,将线程数减1,当线程数减至0时,以等待的线程同时抢夺执行。

注意,等待中的线程因某个原因被释放时,其它等待的线程也会被释放

下列条件满足可以使得等待中的线程被释放继续执行:

最后一个线程到达;

当前线程被其它线程打断

其它等待的线程被打断;

其它线程等待的线程因超时而被释放;

外部线程重置了计数器,CyclicBarrier.reset()

支持一个栅栏行动,就是一个Runnable实例,在栅栏被打开时,该Runnable也会被执行。

4CountDownLatch CyclicBarrier的不同之处?

CountDownLatch只能使用一次。而CyclicBarrier可以使用多次,通过reset将计数器的值重置为初始值;

CyclicBarrier还有其它方法,例如getNumberWaiting()可以获得阻塞的线程数,isBroken()可以获得阻塞的方法是否被中断

5Semaphore - 信号量

信号量的值表示允许最多同时只能有该值个线程执行。每有一个线程执行调用一次acquire()方法,就表示可执行线程数减1;每有一个线程结束执行,调用一次release()方法,就表示可执行线程数加1。

6Semaphore的用法

保护一个重要的代码,防止过多的线程进入。即线程执行前先获得“许可”;

在两个线程之间进行通信,一个线程调用acquire(),另一个线程调用release()

7Exchanger - 交换机

可以实现两个线程之间数据的交换,它提供一个同步点,在这个点上,两个线程可以通过exchanger()方法进行交换数据,并且先到达的线程调用该方法后,会等待另一个线程到达。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值