CountDownLatch(倒数门闩);等待线程结束后执行减一操作
![](https://img-blog.csdnimg.cn/20210205214929161.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3NDMyMzI=,size_16,color_FFFFFF,t_70)
latch.countDown():线程执行完结束之后,数量减一.但是这是动态操作,可以减的不是1,可以调用多次
latch.await():当latch.countDown()减少到0的时候继续向下执行
CyclicBarrier(计数栅栏):
![](https://img-blog.csdnimg.cn/20210205214929161.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3NDMyMzI=,size_16,color_FFFFFF,t_70)
parties:等待数到达20
new Runnable:数量到达20后执行的内容
barrier.await():每一个线程都执行完,parties加1,等待parties的数到达20,执行new Runnable中的方法
*举例:不同线程执行不同操作,A执行数据库,B执行网络,C执行IO操作,ABC都执行完了之后才执行await后面的操作
Phaser(阶段):按照不同阶段执行,每一个阶段都会等待上一个阶段所有线程都执行完
public
class
MyPhaser
extends
Phaser {
@Override
protected
boolean
onAdvance(
int
phase,
int
registeredParties) {
//在每个阶段执行完成后回调的方法
switch
(phase) {
case
0
:
return
第1阶段();
//全部阶段未完成,当前阶段完成 返回false
case
1
:
return
第2阶段
();
//全部阶段未完成,当前阶段完成 返回false
case
2
:
return
第3阶段
();
//全部阶段未完成,当前阶段完成 返回false
default
:
return
true
; //全部阶段完成 返回true
}
}
private
boolean
第1阶段
(){
System.out.println(
"
全部阶段未完成,当前阶段完成 返回false
"
);
return
false
;
}
private
boolean
第2阶段
(){
System.out.println(
"
全部阶段未完成,当前阶段完成 返回false
"
);
return
false
;
}
private
boolean
所有阶段完成
(){
System.out.println(
"所有阶段完成"
);
return
true
;
}
*举例:遗传算法
ReadWriteLock(读写锁):共享锁(读锁)和排他锁(写锁)
加了读锁之后,只允许读线程并发进入读
加了写锁之后,写线程按照正常lock写
![](https://img-blog.csdnimg.cn/20210205214929160.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3NDMyMzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210205214929140.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3NDMyMzI=,size_16,color_FFFFFF,t_70)
Semaphore(信号量):
![](https://img-blog.csdnimg.cn/20210205214929170.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3NDMyMzI=,size_16,color_FFFFFF,t_70)
permits:信号灯数量
s.acquire()(取得):阻塞方法,执行之后permits减1并得到锁,如果permits为0,下一个线程来了之后发现是0就等待拿到锁的释放锁
s.release();执行完操作之后释放信号灯数量为1
*信号灯的数量不定,做限流用.表示最多几个线程可以同时执行
Exchanger(交换器):用于线程之间交换数据
![](https://img-blog.csdnimg.cn/20210205214929210.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3NDMyMzI=,size_16,color_FFFFFF,t_70)
双线程中,一个线程执行exchanger.exchange方法会进入阻塞,等待第二个线程exchanger.exchange,都到位了之后就交换,只能两个线程交换数据
![](https://img-blog.csdnimg.cn/20210205214929179.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3NDMyMzI=,size_16,color_FFFFFF,t_70)