服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - JAVA教程 - Java中的5种同步辅助类介绍

Java中的5种同步辅助类介绍

2019-11-20 15:23Java教程网 JAVA教程

你提交了一些任务,但你想等它们都完成了再做另外一些事情;你提交了一些任务,但是不想让它们立刻执行,等你喊123开始的时候,它们才开始执行;等等这些场景,线程之间需要相互配合,或者等待某一个条件成熟执行。这些

当你使用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 的双向形式,在运用到遗传算法和管道设计的应用中比较有用。

延伸 · 阅读

精彩推荐
  • JAVA教程求1000阶乘的结果末尾有多少个0

    求1000阶乘的结果末尾有多少个0

    题目是:求1000!的结果末尾有多少个0,解题思路:两个素数2、5,相乘即可得到10,我们可以认为,有多少组2、5,结尾就有多少个0,下面是代码,需要的朋...

    java教程网3932019-11-10
  • JAVA教程java排序去重示例分享

    java排序去重示例分享

    这篇文章主要介绍了java排序去重示例,对String strs = "ZZZ BBB AAA OOO ZZZ AAA ZZZ"计算出现个数,排序去重,需要的朋友可以参考下 ...

    java技术网2272019-11-08
  • JAVA教程java读写oracle的blob字段示例

    java读写oracle的blob字段示例

    这篇文章主要介绍了java读写oracle的blob字段示例,需要的朋友可以参考下 ...

    java教程网3172019-11-10
  • JAVA教程java字符串拼接与性能分析详解

    java字符串拼接与性能分析详解

    在JAVA中拼接两个字符串的最简便的方式就是使用操作符”+”。如果你用”+”来连接固定长度的字符串,可能性能上会稍受影响,但是如果你是在循环中来...

    java技术网2132019-10-27
  • JAVA教程java动态代理和cglib动态代理示例分享

    java动态代理和cglib动态代理示例分享

    这篇文章主要介绍了java动态代理和cglib动态代理示例,JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例,下面我们使用示...

    java教程网3082019-11-15
  • JAVA教程简单说说Java SE、Java EE、Java ME三者之间的区别

    简单说说Java SE、Java EE、Java ME三者之间的区别

    本篇文章小编就为大家简单说说Java SE、Java EE、Java ME三者之间的区别。需要的朋友可以过来参考下,希望对大家有所帮助 ...

    java之家4072019-10-16
  • JAVA教程scala中常用特殊符号详解

    scala中常用特殊符号详解

    这篇文章主要介绍了scala中常用特殊符号详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    咸鱼2462019-07-08
  • JAVA教程java生成json数据示例

    java生成json数据示例

    这篇文章主要介绍了java生成json数据示例,需要的朋友可以参考下 ...

    zxhpj4722019-11-18