Java并发编程学习笔记(3)——线程同步进阶 | 程序员的自我修养 | 关注Java、大数据、机器学习
程序员的自我修养
Home » Java语言, 并发编程 » Java并发编程学习笔记(3)——线程同步进阶

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

0条评论1,469次浏览

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
  • 文章总数:81篇
  • 评论总数:279条
  • 分类总数:32个
  • 标签总数:45个
  • 运行时间:1520天

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

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

最新评论
  • Anonymous: :roll:
  • Anonymous: :razz: :evil: :smile: :grin: :???:
  • Anonymous: 运行报错:java.lang.Abstr actMethodError
  • Anonymous: :arrow:
  • Anonymous: :oops:
  • Anonymous: :smile: :smile: :smile: :smile:
  • Anonymous: :mrgreen: :twisted: :razz:
  • zzg: 请问zz你问题核实了没 我也遇到了这个奇葩 问题,我们也是基...
  • Anonymous: :?: :sad: :evil:
  • kuyuzasur: what do i tell doctor to get viagra. edhelprie.mdhelpserv.com – how long we can take viagra,
  • Anonymous: 这个问题可以忽略。不 影响
  • Anonymous: :?: :razz: :sad:
  • Anonymous: 牛
  • Anonymous: 楼主你好,我偶尔也会 遇到Reconnect due to socket error: java.nio.channels.ClosedCha...
  • Anonymous: sdfs
  • Anonymous: :arrow: :neutral: :cry:
  • Anonymous: java.io.NotSerializableExcepti on: DStream checkpointing has been enabled but the DStreams with their...
  • wick: HI,请问一下,U,S,V得到 ,怎么得到近似矩阵 (用spark java),谢谢。
  • Michael Whitaker: Thank you for this blog, it was very helpful in troubleshooting my own issues. It seems that no...
  • Anonymous: :mad: