当你使用synchronized关键字的时候,是通过互斥器来保障线程安全以及对共享资源的同步访问。线程间也经常需要更进一步的协调执行,来完成复杂的并发任务,比如wait/notify模式就是一种在多线程环境下的协调执行机制。

通过API来获取和释放锁(使用互斥器)或者调用wait/notify等方法都是底层调用的方式。进一步来说,有必要为线程同步创建更高层次的抽象。通常用到的同步辅助类,就是对2个或多个线程间的同步活动机制做进一步封装,其内部原理是通过使用现有的底层API来实现复杂的线程间的协调。

有5种同步辅助类适用于常见的同步场景

1. Semaphore 信号量是一类经典的同步工具。信号量通常用来限制线程可以同时访问的(物理或逻辑)资源数量。

2.CountDownLatch 一种非常简单、但很常用的同步辅助类。其作用是在完成一组正在其他线程中执行的操作之前,允许一个或多个线程一直阻塞。

3.CyclicBarrier 一种可重置的多路同步点,在某些并发编程场景很有用。它允许一组线程互相等待,直到到达某个公共的屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier在释放等待线程后可以重用,所以称它为循环的barrier。

4.Phaser 一种可重用的同步屏障,功能上类似于CyclicBarrier和CountDownLatch,但使用上更为灵活。非常适用于在多线程环境下同步协调分阶段计算任务(Fork/Join框架中的子任务之间需同步时,优先使用Phaser)

5.Exchanger 允许两个线程在某个汇合点交换对象,在某些管道设计时比较有用。Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据。每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收他的伙伴线程提供的数据并返回。当两个线程通过Exchanger交换了对象,这个交换对于两个线程来说都是安全的。Exchanger可以认为是 SynchronousQueue 的双向形式,在运用到遗传算法和管道设计的应用中比较有用。

转载于:https://www.cnblogs.com/qiumingcheng/p/5392851.html

Java中的5种同步辅助类相关推荐

  1. java中的四种代码块

    原文链接: java中的四种代码块_Munt的博客-CSDN博客_java中代码块 在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造 ...

  2. java 代码块_详解java中的四种代码块

    在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造代码块: 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行. ...

  3. java中的几种锁(很详细)-小白收藏

    最近学习java中的几种锁,看到比较详细的一篇,先转发,后续补充自己的见解 其实如果按照名称来说,锁大概有以下名词:  自旋锁 ,自旋锁的其他种类,阻塞锁,可重入锁 ,读写锁 ,互斥锁 ,悲观锁 ,乐 ...

  4. java中的复合数据类型是什么_【填空题】类是Java中的一种重要的复合数据类型,是组成Java程序的基本要素。一个类的实现包括两部分:____和_____....

    [填空题]类是Java中的一种重要的复合数据类型,是组成Java程序的基本要素.一个类的实现包括两部分:____和_____. 更多相关问题 [名词解释] 观叶树木 [单选] 开花时有浓郁香气的树种是 ...

  5. Java 中的四种引用

    垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进行垃圾回收之前,虚拟 ...

  6. 分析Java中的三种不同变量的区别

    1.首先分析Java中的三种不同变量的区别,如下表所示   概念 默认值 其他 类变量 也叫静态变量,是类中独立于方法之外的变量 用static 修饰 有默认初始值,系统自动初始化. 如boolean ...

  7. java中的五种排序方法_用Java排序的五种有用方法

    java中的五种排序方法 Java排序快速概述: 正常的列表: private static List VEGETABLES = Arrays.asList("apple", &q ...

  8. java类型转换答案,在java中支持两种类型的类型转换,自动类型转换和强制类型转换。父类转化为子类需要强制转换。...

    在java中支持两种类型的类型转换,自动类型转换和强制类型转换.父类转化为子类需要强制转换. 更多相关问题 计算机病毒通过()传染扩散得极快,危害最大. 当一个现象的数量由小变大,另一个现象的数量相反 ...

  9. Java中的两种异常类型及其区别?

    Java中的两种异常类型及其区别? 参考文章: (1)Java中的两种异常类型及其区别? (2)https://www.cnblogs.com/zxfei/p/11182730.html (3)htt ...

最新文章

  1. 基于 K8S 构建数据中心操作系统
  2. 序列两两比对算法_【陪你学生信】八、序列两两比对
  3. hive on tez踩坑记2-hive0.14 on tez
  4. re搜索字符串与find字符串不一样的结果
  5. JZOJ 100035. 【NOIP2017提高A组模拟7.10】区间
  6. Linux 进阶笔记(二)
  7. 四元数左乘右乘_四元数、欧拉角学习笔记个人理解
  8. Java的终结器仍然存在
  9. oracle sql文字列函数,Oracle 数据库SQL中 decode()函数简介
  10. launchMode
  11. full outer join 与full join的区别_基础小白的SQL的JOIN语法解析
  12. postgresql 索引状态_PostgreSQL中的锁:3.其他锁
  13. 【Oracle】删除重复记录
  14. Klevgrand Tines for Mac(电钢琴模拟插件)
  15. PMP第五章:项目范围管理
  16. 53、Docker镜像仓库(搭建私有的镜像仓库(浏览器可以访问))
  17. 靶机渗透练习06-driftingblues6 (利用脏牛提权)
  18. 把steam上下载的GTA5转移到Epic中,免除Epic再次下载GTA5的方法
  19. HDU 3496 Watch The Movie(看电影)
  20. 22考研中科大计算机专业经验分享

热门文章

  1. node 使用 download-git-repo 下载 github 代码
  2. python2 队列的使用_python双端队列原理、实现与使用方法分析
  3. html 怎么让tr的css覆盖td的_html表格标签
  4. 开发日记-20190825 关键词 管道和FIFO
  5. 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。...
  6. 【TensorFlow】tf.nn.softmax_cross_entropy_with_logits的用法
  7. 机器学习样本标记 示意代码
  8. Scrum介绍——续
  9. python - 多线程简单实现
  10. 企业安全体系建设方案设计(内附案例)