Java --并发--继续 第五弹--闭锁

并发控制工具详解
本文深入探讨了并发编程中的闭锁、Future、CountDownLatch等工具的原理及应用,如闭锁确保活动按顺序执行,Future用于获取异步计算结果,CountDownLatch用于同步线程。

闭锁:延迟线程的进度,直到其到达终止状态

1:就像是一道门初始状态大门一直是关闭的,在达到结束状态之前,这扇门将会打开,此时允许所有的线程通过,达到结束状态后将不会再改变,

作用:确保某些活动直到其它活动都执行完毕后再执行

 例如: 1确保某个计算在需要的资源被初始化之后再执行,此时叫做二元闭锁

 2:确保某个服务在其依赖的服务启动完成之后再启动

 

Future:,也是一种闭锁的实现方式,表示一种可生成抽象结果的运算, FutureTask表示的计算是通过callable实现的,表示一种可生成结果的Runnable


处于三种状态:等待运行,正在运行,运行完成

Future.get//的行为取决于任务的状态,如果任务已经完成,那么get会立即返回,如果任务还未完成,get会一直阻塞,直到任务完成,或者抛出异常,

futureTask将执行计算的结果,从一个当前线程传递另一个线程是线程安全的



CountingSemaphore计数信号量:用来控制某个特定资源的操作数量或者同时执行某个操作的数量

1:acquire将获取一个许可,如果此时没有足够的许可,那么此时

2:release将返回一个许可,给信号量

具备不可重入的加锁语意,谁拥有许可,谁就拥有了这个互斥锁


例如数据库连接池就是一种常用的用法,数据库连接池,当池中非空的时候,将可以获得连接,当池中为空时,此时请求资源会失败,此时希望看到的是阻塞,当release释放许可给信号量的时候

此时希望能够获得连接池。我们可以使用Semaphore,将任何一种容器变为有界容器,

闭锁是一次性对象,一旦进入就不能被重置


cycleBarrier:线程必须同时到达栅栏位置,才能继续执行,栅栏类似于闭锁他能阻塞一组线程直到等待事件发生,栅栏与闭锁的根本区别在于:栅栏用于等待一组线程,而闭锁用于等待一组事件

栅栏用于实现一些协议,例如几个家庭决定在某个地方集合,使参与数量的一方反复的在栅栏位置汇集,并行迭代算法中非常有用,这种算法通常将一个问题拆分成一系列的子问题,当线程到达时将

调用await方法,这个方法将阻塞所有线程到达栅栏位置,直到所有的线程都到达,此时栅栏将会打开,弱国线程被打断,此时所有的阻塞将会失效成功,此时await将会为每个线程分配一个索引号

我们可以利用这个索引来产生一个领导线程,并利用这个领导线程在下个迭代中,执行以一些特殊的工作。


转载于:https://my.oschina.net/u/876290/blog/373301

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值