博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
同步工具类 Java并发编程实战 学习笔记
阅读量:4170 次
发布时间:2019-05-26

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

  • 阻塞队列
  • 闭锁
  • 栅栏
  • FutuerTask
  • 信号量

 

同步工具类可以根据自身的状态来协调线程的控制流。

同步工具类都包含特定的结构化属性,封装了一些状态,这些状态觉得指定同步工具类的线程是继续执行还是等待。同时,提供了操作状态的方法。

阻塞队列

阻塞队列不仅能作为保存对象的容器,还能协调生产者和消费者等线程之间的控制流。take和put等方法将阻塞,直到队列达到期望的状态。

闭锁

闭锁是一种同步工具类,可以延迟线程进度直到其到达终止状态。闭锁的作用相当于一扇门,闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当结束时,这扇门会打开,并且允许所有线程通过。闭锁可以用来确保某些活动直到其他活动都完成后才继续执行。

比如:确保某个计算在所有依赖的资源都被初始化之后才继续执行,等到直到某个操作的所有参与者都准备就绪再继续执行。

闭锁状态包括计数器,被初始化为一个整数,等待的每个任务完成之后-1,当计数器变成0之后表示等待的所有事件都已经完成了,可以进行后续的计算了。

CountDownLatch是一种实现。

FutureTask

FutureTask通过Callable来实现的,有三种状态,等待运行、正在运行和运行完成。完成包括正常结束、取消导致结束和异常导致结束。

当程序中有耗时的操作,并且可以分为多个可以并行执行的流程,然后最后聚合结果的时候,可以考虑使用FutureTask来加速执行

public T someMethod(){    FutureTask
task1= new FutureTask(....); FutureTask
task2= new FutureTask(....); FutureTask
task3= new FutureTask(....); executor.submit(task1); executor.submit(task2); executor.submit(task3); try{ task1.get(); task2.get(); task3.get(); // 聚合操作 }catch(Exception e){ // 异常处理 } // ...}

信号量

计数信号量可以控制同时访问某个特定资源的操作数量。

Semaphore中管理者一组虚拟的permit,在初始化时指定数量,执行之前先获取许可,使用之后释放。

栅栏

栅栏类似于闭锁,能阻塞一组线程知道某个事件发生。

区别:栅栏与闭锁关键区别在于所有线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,栅栏用于等待其他线程(参考:)。CyclicBarrier是一种实现,可以使一定数量的参与方反复在栅栏位置执行。

Exchanger也是另一种栅栏,可以用于两个线程之间交换数据,可以参考(,)

转载地址:http://ylyai.baihongyu.com/

你可能感兴趣的文章
2018.3.19
查看>>
A Game of Thrones(97)
查看>>
A Game of Thrones(98)
查看>>
2018.3.20
查看>>
2018.3.21
查看>>
2018.3.22
查看>>
2018.3.23
查看>>
A Game of Thrones(102)
查看>>
2018.4.29
查看>>
2018.4.30
查看>>
2018.4.31
查看>>
2018.4.32
查看>>
2018.4.33
查看>>
《python基础教程》答案(第一章)
查看>>
2018.4.34
查看>>
2018.4.35
查看>>
2018.4.36
查看>>
我为什么要写博客
查看>>
如何导入pycharm无法导入的包
查看>>
2018.4.37
查看>>