首页 技术 正文
技术 2022年11月9日
0 收藏 627 点赞 5,058 浏览 2645 个字

Java 并发系列之八:java 并发工具(4个)

1. CountDownLatch

Java 并发系列之八:java 并发工具(4个)

2. CyclicBarrier

Java 并发系列之八:java 并发工具(4个)

3. Semaphore

Java 并发系列之八:java 并发工具(4个)

4. Exchanger

Java 并发系列之八:java 并发工具(4个)

5. txt

 java 并发工具
通俗理解
CountDownLatch
等ABCD 4个人都结束了,自己才能开始,结束一个减一个
CyclicBarrier
我和A,B,C,D 5个人互相等待,会合了再一起进电影院,到一个减一个
Semaphore
计数器,鸡蛋篮子里只能放5个鸡蛋,缺几个,才能放几个
Exchanger
A和B交换数据
CountDownLatch
CountDownLatch 它允许一个或多个线程等待其他N个指定数量线程完成操作
CountDownLatch也可以实现join的功能,并且比join的功能更多
AQS(队列同步器) 共享锁
内部类
sync为CountDownLatch的一个内部类,而Sync继承AQS。
采用共享锁来实现的。
重要操作
CountDownLatch(int count)
构造一个用给定计数初始化的 CountDownLatch,count为计数器的初始值,也可以理解为该共享锁可以获取的总次数。
await()
使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断
awit(long time, TimeUnit unit)
带指定时间的await方法,这个方法在等待特定时间之后,就不会阻塞当前线程。
countDown()
递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
一个线程调用countDown方法 happen-before 另外一个线程调用 await 方法
注意CountDownLatch不能回滚重置。
CyclicBarrier
定义
可循环使用的同步屏障:它允许一组线程互相等待,直到达到某个公共屏障点(common barrier point)
通俗讲:让一组线程到达一个屏障是被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活
底层采用ReentrantLock + Condition 实现
重要操作
两个构造函数
CyclicBarrier(int parties):parties表示屏障拦截的线程数量(插入的屏障数),每个线程调用await方法告诉CyclicBarrier已经到达了屏障,然后当前线程被阻塞。
CyclicBarrier(int parties, Runnable barrierAction) :用于在线程到达屏障前,优先执行barrierAction,方便处理更复杂的业务场景
其他方法
getNumberWaiting
获得CyclicBarrier阻塞的线程数量
isBrocken
了解阻塞的线程是否被中断
await()
插入屏障,到达了屏障,本质上相当于屏障数-1
应用场景
多线程结果合并的操作,用于多线程计算数据,最后合并计算结果的应用场景
CyclicBarrier V.S. CountDownLatch
CountDownLatch的作用是允许1个或N个线程等待其他线程完成执行;
CyclicBarrier则是允许N各线程互相等待
CountDownLatch的计数器无法被重置,只能使用一次如果需要重置计数,请考虑使用CyclicBarrier.
CyclicBarrier的计数器可以被reset重置后使用,因此它被称为是循环的barrier,能处理更为复杂的业务场景。例如计算发生错误,可以重置计数器,并让线程重新执行一次
Semaphore
信号量
计数器,用来控制同时访问特定资源的线程数量,他通过协调各个线程,以保证合理的使用公共资源
内部采用共享锁实现
信号量Semaphore是一个非负数(>=1)。当一个线程想要访问某个共享资源时,它必须要先获取Semaphore,当Semaphore>0 时,获取该资源并使 Semaphore-1. 如果Semaphore=0,则表示全部的共享资源已经被其他线程全部占用,线程必须要等待其他线程释放资源。当线程释放资源时,Semaphore+1。
从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个acquire(),然后再获取该许可。每个release()添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore只对许可的号码进行计数,并采取相应的行动。
重要操作
Semaphore(int permits)
构造函数,接受一个整型的数字,表示可用的许可证数量,也就是最大的并发量
acquire
获取一个许可证
tryAcquire
尝试获取一个许可证
release
归还许可证
int availablePermits()
返回此信号量中当前可用的许可证数
int getQueueLength()
返回正在等待获取许可证的线程数
boolean hasQueuedThreads()
是否有线程正在等待获取许可证
void reducePermits(int reduction)
减少reduction个许可证
Collection getQueuedThreads()
返回所有等待获取许可证的线程集合
应用场景
用于流量控制,特别是公用资源有限的应用场景,比如数据库连接。
Exchanger
定义
交换者,是一个用于线程间协作的工具类,用于进行线程间的数据交换,两个线程
它提供一个同步点,用于进行线程间成对配对及交换数据,
具体
第一个线程先执行exchange()方法,它会一只等待第二个线程也执行exchange()方法,当两个线程都到达同步点时,两个线程就可以交换数据,将本线程生产出来的数据传递给对方
允许在并发任务之间交换数据。具体来说,Exchanger类允许在两个线程之间定义同步点。当两个线程都到达同步点时,他们交换数据结构,因此第一个线程的数据结构进入到第二个线程中,第二个线程的数据结构进入到第一个线程中
应用场景
遗传算法
交叉
校对工作
AB岗录入电子银行流水
Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用。

6. 参考网址

  1. 参考来源:http://cmsblogs.com/wp-content/resources/img/sike-juc.png
  2. 《Java并发编程的艺术》_方腾飞PDF 提取码:o9vr
  3. http://ifeve.com/the-art-of-java-concurrency-program-1/
  4. Java并发学习系列-绪论
  5. Java并发编程实战
  6. 死磕 Java 并发精品合集
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,501
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,915
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,748
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,505
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,143
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,306