Java 并发工具类

2021-04-07  本文已影响0人  向梦而来

Semaphore 是什么?

Semaphore ,是一种新的同步类,它是一个计数信号。从概念上讲,从概念上讲,信号量维护了一个许可集合。

信号量常常用于多线程的代码中,比如数据库连接池。

说说 CountDownLatch 原理

CountDownLatch ,字面意思是减小计数(CountDown)的门闩(Latch)。它要做的事情是,等待指定数量的计数被减少,意味着门闩被打开,然后进行执行。

CountDownLatch 默认的构造方法是 CountDownLatch(int count) ,其参数表示需要减少的计数,主线程调用 #await() 方法告诉 CountDownLatch 阻塞等待指定数量的计数被减少,然后其它线程调用 CountDownLatch 的 #countDown() 方法,减小计数(不会阻塞)。等待计数被减少到零,主线程结束阻塞等待,继续往下执行。

说说 CyclicBarrier 原理

CyclicBarrier ,字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。

CyclicBarrier 默认的构造方法是 CyclicBarrier(int parties) ,其参数表示屏障拦截的线程数量,每个线程调用 #await() 方法告诉 CyclicBarrier 我已经到达了屏障,然后当前线程被阻塞,直到 parties 个线程到达,结束阻塞。

说说 Exchanger 原理

实际场景下,问了一圈朋友,Exchanger 基本没在业务中使用过。

CyclicBarrier 和 CountdownLatch 有什么区别?

CyclicBarrier 可以重复使用,而 CountdownLatch 不能重复使用。

整理表格如下:

CountDownLatch CyclicBarrier
减计数方式 加计数方式
计算为 0 时释放所有等待的线程 计数达到指定值时释放所有等待线程
计数为 0 时,无法重置 计数达到指定值时,计数置为 0 重新开始
调用 #countDown() 方法计数减一,调用 #await() 方法只进行阻塞,对计数没任何影响 调用 #await() 方法计数加 1 ,若加 1 后的值不等于构造方法的值,则线程阻塞
不可重复利用 可重复利用
上一篇 下一篇

猜你喜欢

热点阅读