程序员的自我修养
Home » Java语言, 并发编程 » Java并发编程学习笔记(3)——线程同步进阶

Java并发编程学习笔记(3)——线程同步进阶

0条评论1,016次浏览

Semaphore

Semaphore是一个控制访问多个共享资源的计数器。当计数器值大于0,代表还有可用资源,线程可以继续访问和使用资源;当计数器的值等于0,代表暂无可用资源,线程必须等待资源的释放。

一个典型的例子就是,有多台打印机,当新的打印任务来时,将检测是否还有可用的打印机,若有则使用,并将可用打印机数量减1;若无则等待;当使用完毕后,释放打印机,将可用打印机数量加1。

使用示例

  • 同Lock一样,Semaphore也可开启公平机制,Semaphore(int permits, boolean fair)
  • acquireUninterruptibly(),与acquire()的区别是:线程中断不会抛出异常
  • tryAcquire(),尝试获取semaphore。如果成功,返回true。如果不成功,返回false值,并不会被阻塞和等待semaphore的释放。

CountDownLatch

CountDownLatch,用于等待多个并发事件完成,相当于一个倒数计数器,初始化时传入一个整数参数,调用方法countDown()减少计数,当计数为0时,解除await()的休眠。

使用示例

CountDownLatch的计数器一旦初始化就无法更改。

CyclicBarrier

CyclicBarrier,用于在同一个点同步任务,与CountDownLatch类似,但CyclicBarrier可以在计数器等于0时执行初始化时传递的Runnable对象。

使用示例

CyclicBarrier的计数器可以重置,reset()

Phaser

Phaser,用于阶段性并发任务的同步。CyclicBarrier可以在一个点同步任务,当需要在运行过程中多个点同步线程,则可以用Phaser来处理。

使用示例

若没有Phaser来阶段性的同步,输出的结果可能是“1 1 2 2”、“1 2 1 2”。但加入Phaser来阶段性的同步后,输出结果一定是“1 1 2 2”。

Phaser提供每次phaser改变阶段都会执行的方法,onAdvance(),可以Override该方法来实现不同的业务逻辑。

使用示例

再次运行上述程序,结果则变为“1 1 p0 2 2 p1 end”。

Exchanger

Exchanger,用于并发任务间交换数据,但只适用于1对1的交换。

使用示例

运行结果

t1 Before: 11111
t2 Before: 22222
t2 After: 11111
t1 After: 22222

(转载本站文章请注明作者和出处 程序员的自我修养 – SelfUp.cn ,请勿用于任何商业用途)
标签:,
发表评论


profile
  • 文章总数:78篇
  • 评论总数:252条
  • 分类总数:31个
  • 标签总数:43个
  • 运行时间:946天

大家好,欢迎来到selfup.cn。

这不是一个只谈技术的博客,这里记录我成长的点点滴滴,coding、riding and everthing!

最新评论
  • pacificLee: :twisted:
  • 小码: 为什么没有后面的呢,只有前10个
  • Anonymous: :lol:
  • Anonymous: :razz: 楼主是属于会聊天的。 我想问,sqoop发了几个版本了,应该没这些问题了吧。
  • Anonymous: Config.kafkaConfig.kafkaGroupI d 这个是指自己配置的group id 还是从 import org.apache.kafka.common.config .Config 这个类...
  • Anonymous: ZkUtils.getPartitionsForTopics (zkClient, Config.kafkaConfig.topic) 那个方法是在 spark-streaming_2.10 中 kafka...
  • Anonymous: ZkUtils.getPartitionsForTopics (zkClient, Config.kafkaConfig.topic) 你确定 kafka 里面有这个类 ? 个人在kafka 最新 稳定版...
  • Anonymous: :roll:
  • Anonymous: 很不错,试问有java版的吗?
  • Anonymous: 赞
  • Anonymous: 哈哈 看楼主的吐槽乐死了 where子句是可以写的 同样找不到资料 一点点试出来的 select id from xxxx where ${CONDITIONS} and 1=1 and 2=2 limit 4
  • EVIL: 我在运行完C4.5的代码后,显示 defined object DecisionTreeTest 是什么意思?这是有错误吗?运行结果在哪里看?
  • sf: 楼主的问题,我都遇到。。。没办法项目已经定型了,最后都硬着头 皮一个一个的改了源码
  • zz: 我去,楼主你真及时,我们今天上了新的HTTP2 push之后也发现速度曲线很奇怪,开始有200k/min,跟 另一台老的推送协议速度差不多,但是过了一会,立马降到只有几k /min,百思不得其解,我们还用了一个海外代理,在...
  • qi365: :mad: 很可恶,百度助纣为虐~
  • qi365: :? :shock: haha~ very good~
  • 张是大: 《深入浅出Spark机器学习实战(用户行为分析)》 课程网盘下载:http://pan.baidu.com/s/ 1mixvUli 密码:1pfn
  • Anonymous: :???:
  • Anonymous: 我用着sqoop感觉还可以,select 几十个字段也没事,估计是版本低。。
  • Anonymous: :grin: