博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java --并发--继续 第五弹--闭锁
阅读量:6079 次
发布时间:2019-06-20

本文共 1055 字,大约阅读时间需要 3 分钟。

hot3.png

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

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

你可能感兴趣的文章
多线程之线程池任务管理通用模板
查看>>
CSS3让长单词与URL地址自动换行——word-wrap属性
查看>>
CodeForces 580B Kefa and Company
查看>>
开发规范浅谈
查看>>
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming
查看>>
鼠标增强软件StrokeIt使用方法
查看>>
本地连接linux虚拟机的方法
查看>>
某公司面试java试题之【二】,看看吧,说不定就是你将要做的题
查看>>
BABOK - 企业分析(Enterprise Analysis)概要
查看>>
Linux 配置vnc,开启linux远程桌面
查看>>
NLog文章系列——如何优化日志性能
查看>>
Hadoop安装测试简单记录
查看>>
CentOS6.4关闭触控板
查看>>
ThreadPoolExecutor线程池运行机制分析-线程复用原理
查看>>
React Native 极光推送填坑(ios)
查看>>
Terratest:一个用于自动化基础设施测试的开源Go库
查看>>
修改Windows远程终端默认端口,让服务器更安全
查看>>
扩展器必须,SAS 2.0未必(SAS挺进中端存储系统之三)
查看>>
Eclipse遇到Initializing Java Tooling解决办法
查看>>
while((ch = getchar()) != '\n')
查看>>