在J.U.C包中,提供了几个非常有用的并发工具类,通过使用这些工具类,可以有效提高并发编程中,并发流程的控制,以提升效率和代码质量,如下: CountDownLatch CyclicBarrier Semaphore 控制并发线程数的Semaphore Semaphore(信号量)用来控制同时访问特定资源的线程数量; 1. } 在构造函数中,可以传入两个参数: permits: 可用的许可证数量 fair: 是否公平获取许可证 比如Semaphore(10,true),就表示允许10个线程获取许可证,也就是最大的并发量为
本篇内容包括:Java 并发工具类的介绍、使用方式与 Demo,包括了 CountDownLatch(线程计数器)、CyclicBarrier(回环栅栏)、Semaphore(信号量) 以及 Exchanger CountDownLatch(线程计数器) CountDownLatch 线程计数器,俗称闭锁,作用是类似加强版的 Join,是让一组线程等待其他的线程完成工作以后才执行 CountDownLatch 类位于 java.util.concurrent 包下,利用它可以实现类似计数器的功能。 Semaphore 类中比较重要的几个方法: public void acquire():用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可。
等待多线程完成CountDownLatch 同步屏障CyclicBarrier 控制并发线程数Semaphore 线程间交换数据Exchanger 在J.U.C包中,提供了几个非常有用的并发工具类,CountDownLatch 、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程间交换数据的一种手段。 通过使用这些工具类,可以有效提高并发编程中,并发流程的控制,以提升效率和代码质量。 等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作。 是JUC包中的一个工具类,是用来创建锁和其他同步类的基本线程阻塞原语,可以让线程在任意位置阻塞,也可以在任意位置唤醒。 参考: 《Java并发编程的艺术》 Java并发工具类:https://blog.csdn.net/weixin_36208314/article/details/115077591 Java并发工具类详解
,阻塞等待第二个线程也执行exchange方法,都到达同步点时,线程就可以交换数据 exchange(V x, long timeout, TimeUnit unit)方法可以超时等待 import java.util.concurrent.Exchanger ; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author
构造参数int parties,表示屏障拦截的线程数量,每个线程调用await()方法表示自己已经到达屏障,进入阻塞 import java.util.concurrent.CyclicBarrier; } 有一个更高级的方法CyclicBarrier(int parties, Runnable barrierAction)用于在线程达到屏障点时,优先执行barrierAction: import java.util.concurrent.CyclicBarrier
import java.util.concurrent.CountDownLatch; /** * @author pengjunzhe */ public class CountDownLatchTest
:返回是否有线程在等待 void reducePermits(int reduction):减少reduction个许可证,是个protected方法 以下例子虽然有30个线程在执行,但是只允许10个并发执行 : import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore
(5)getCount() 返回当前count的数量 下面我们看一个比较典型的一个例子: package concurrent.tools; import java.util.Random; import java.util.concurrent.CountDownLatch; /** * Created by Administrator on 2018/8/20. */ public class new IgniteInterruptedCheckedException(e); } } 最后需要注意的是CountDownLatch仅仅只能被用一次,不能被重置,如果需要循环重置则需要使用Java 并发工具包的另外一个类CyclicBarrier。
Phaser(移相器,一种电子元件)是JDK7中引入的新的并发工具辅助类,oralce官网文档描述Phaser是一个可重复使用的同步栅栏,功能上与 CountDownLatch 和 CyclicBarrier 类似但支持的场景更加灵活,这个类可能是目前并发包里面实现最复杂的一个了。 这其实就是一个典型的循环栅栏的例子,我们直接来看如何使用Phaser来完成: package concurrent.tools.phaser; import java.util.Random; import java.util.concurrent.Phaser; import java.util.concurrent.TimeUnit; /** * Created by Administrator 本文主要了介绍了JDK7引入的并发工具类Phaser,这个类的功能与CountDownLatch 和 CyclicBarrier类似但更灵活,这个类底层相对比较复杂并没有采用AQS同步框架实现,而是单独定义了相关功能
Semaphore是Java里面另外一个基本的并发工具包类,主要的的作用是用来保护共享资源的访问的,也就是仅仅允许一定数量的线程访问共享资源。 总结: 本文主要介绍了并发工具包Semaphore其主要作用来限制对于共享资源的访问,接着我们又介绍了其特点,使用及注意事项,然后又给出了使用其他同步工具Lock+Condition实现的Semaphore
CyclicBarrier这个并发工具类和上篇文章中提到的CountDownLatch比较类似,可以把CyclicBarrier看做是可以可以复用的CountDownLatch。 CountDownLatch和CyclicBarrier的不同之处在于: (1)CountDownLatch仅仅可以使用一次而CyclicBarrier可以循环利用 (2)CountDownLatch类强调的是调用 countDown方法的次数,而CyclicBarrier类强调的是至少有N个线程调用await方法。 count > 0) mutex.wait(); mutex.notifyAll(); } } } 总结: 本文主要了介绍了Java 里面CyclicBarrier类功能以及它与CountDownLatch的区别和联系,最后并给出了实现他们的一些伪代码,两者的主要不同之处在于CyclicBarrier是可以多次复用的一个示例,只要指定的数量的线程调用
Exchanger类是JDK5中的一个并发工具辅助类,这个类的主要作用是可以用于两个线程之间交换数据,以实际生活中的场景来讲,比如很多小区楼下都有自取的快递柜,如果快递员来了,就把东西直接放快递柜子就行了 如果我们一直买东西,而不邮寄东西,那么Exchanger类其实就变成了简化版本的生产者和消费者的模型。 Thread(new ConsumerWorker(3),"我 ").start(); //启动消费者,每次睡眠3秒,启动顺序不分先后 } /*** * 数据交换类 本文主要介绍了Java里面并发工具类Exchanger,使用Exchanger可以轻松的给两个线程进行数据交换,这里需要注意的是如果超过两个线程操作交换,那么则很有可能出现问题,这里想象一下我们的快递柜的例子就很容易想明白 https://github.com/qindongliang/Java-Note
Exchanger类的功能比较类似,准确点讲与上篇我们使用Exchanger类构建的生产者消费者的队列非常类似,只不过SynchronousQueue更加完善提供了队列里面一些基本的操作。 这种机制看似非常的不合理,但其确实有其使用的场景,尤其是消息或者任务的传递,这种模式更像CSP的并发模型Communicating Sequential Process,这里引申一下一些语言里面的并发机制 在Java里面线程池Executors.newCachedThreadPool就是使用SynchronousQueue类在内部构建,创建的线程数量仅仅是按需所取,使用SynchronousQueue的目的就是保证 本文主要介绍了Java里面比较特殊的一种阻塞队列SynchronousQueue,其设计的主要目的是为了处理一些handoff(切换/传递)的设计,指的是一个线程的信息,事件或者任务要传递到另一个线程中处理 ,这种处理方式与CSP的并发机制比较类似,并且在队列和线程数量为1的时候相比其他的阻塞队列,其吞吐量非常出色,所以我们可以在一些适合的场景下使用这个特别的同步阻塞队列。
转载请以链接形式标明出处: 本文出自:103style的博客 Java并发编程的艺术笔记 并发编程的挑战 Java并发机制的底层实现原理 Java内存模型 Java并发编程基础 Java中的锁的使用和实现介绍 Java并发容器和框架 Java中的12个原子操作类介绍 Java中的并发工具类 Java中的线程池 Executor框架 ---- 简介 在JDK的并发包里提供了几个非常有用的并发工具类。 提供并发流程控制的工具类 CountDownLatch CyclicBarrier Semaphore 提供了在线程间交换数据的工具类 Exchanger 本文会配合一些应用场景来介绍如何使用这些工具类 线程间交换数据的Exchanger Exchanger(交换者)是一个用于线程间协作的工具类。 Exchanger用于进行线程间的数据交换。 小结 本文配合一些应用场景介绍JDK中提供的几个并发工具类,大家记住这个工具类的用途,一旦有对应的业务场景,不妨试试这些工具类。
同步工具类是个笼统的概念,它可以根据自身状态来协调线程的控制流,了解JAVA中常用的同步工具能帮助开发者写出更好的并发代码。 import java.util.concurrent.CountDownLatch; public class Main { public static void main(String[ import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException 小菜收到消息:我是阿坤,No.2 小菜收到消息:我是阿坤,No.3 阿坤收到消息:我是小菜,No.3 阿坤收到消息:我是小菜,No.4 小菜收到消息:我是阿坤,No.4 done~ */ 总结 所谓同步工具类并不特指实现某种功能的类 ,它们主要的价值就在于能帮助多线程之间更好地相互配合完成工作,只要对自己的需求清晰,对JAVA自带的类熟悉,就能选择合适的同步工具类,甚至实现自己需要的同步工具类。
前言 Java给我们提供了很多通用且好用的并发工具类,现在我就总结一下 Atomic包 更新基本类型变量 Atomic包原子更新基本类型的工具类: AtomicBoolean:以原子更新的方式更新boolean ; 更新类的属性必须使用public volatile进行修饰; CountDownLatch CountDownLatch是一个非常实用的多线程控制工具类。 Semaphore Semaphore叫信号量,Semaphore有两个目的,第一个是多个共享资源互斥使用,第二个是并发线程数的控制。 假如有多个线程读取数据后,需要将数据保存在数据库中,而可用的最大数据库连接只有10个,这时候就需要使用Semaphore来控制能够并发访问到数据库连接资源的线程个数最多只有10个。 } }, "" + i + "号帅哥").start(); } } } 线程间交换数据Exchanger Exchanger是一个用于线程间协作的工具类
等核心组件,其实 JDK 给开发者还提供了比synchronized更加高级的线程同步组件,比如 CountDownLatch、CyclicBarrier、Semaphore、Exchanger 等并发工具类 下面我们一起来了解一下这些常用的并发工具类! 二、常用并发工具类 2.1、CountDownLatch CountDownLatch是 JDK5 之后加入的一种并发流程控制工具类,它允许一个或多个线程一直等待,直到其他线程运行完成后再执行。 下面我们还是先看一个简单的示例,以便于更好的理解这个工具类。 三、小结 本文主要围绕 Java 多线程中常见的并发工具类进行了简单的用例介绍,这些工具类都可以实现线程同步的效果,底层原理实现主要是基于 AQS 队列式同步器来实现,关于 AQS 我们会在后期的文章中再次介绍
Java 并发包提供了哪些并发工具类 Java 基础并发工具类 提供了比 synchronized更加高级的各种同步结构,包括 CountDownLatch, CyclicBarrier、 Semaphore 比如最常见的 ConcurrentHashMap、有序的 ConcunrrentskipListMap,或者通过类似快照机制,实现线程安全的动态数组 Copy onWriteArrayuist等 各种并发队列实现 并发包工具需要掌握哪些 从总体上,把握住几个主要组成部分 理解具体设计、实现和能力。 再深入掌握一些比较典型工具类的适用场景、用法甚至是原理,并熟练写岀典型的代码用例 CountDownLatch 允许一个或者多个线程等待操作完成 CountDownLatch 是不可以重置的,无法重用 https://www.baeldung.com/java-phaser 线程安全的集合 线程安全Map ,List 和 Set。
我们通常所说的并发包也就是 java.util.concurrent 及其子包,集中了 Java 并发的各种基础工具类,具体主要包括几个方面 提供了比 synchronized 更加高级的各种同步结构, Semaphore,Java 版本的信号量实现。 各种并发队列实现,如各种 BlockedQueue 实现,比较典型的 ArrayBlockingQueue、 SynchorousQueue 或针对特定场景的 PriorityBlockingQueue
CyclicBarrier类位于java.util.concurrent包下,CyclicBarrier提供2个构造器: public CyclicBarrier(int parties, Runnable