JUC(4) 辅助类
2023-12-29 00:26:16
# Language
# Java
1. 减少计数 CountDownLatch
CountDownLatch 类可以设置一个计数器,然后通过 countDown
方法来进行减 1 的操作,使用 await
方法等待计数器不大于 0,然后继续执行 await
方法之后的语句。
CountDownLatch
主要有两个方法,当一个或多个线程调用await
方法时,这些线程会阻塞- 其它线程调用
countDown
方法会将计数器减 1 (调用 countDown 方法的线程不会阻塞) - 当计数器的值变为 0 时,因
await
方法阻塞的线程会被唤醒,继续执行
案例
6个同学陆续离开教室之后,班长才能锁门。如果不加 CountDownLatch类,会出现线程混乱执行,同学还未离开教室班长就已经锁门了
不使用CountDownLatch
1 |
|
使用CountDownLatch
1 |
|
2. 循环栅栏 CyclicBarrier
CyclicBarrier 是一个同步铺助类,它允许一组线程互相等待,直到到达某个公共屏障点(common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环的 barrier。
CyclicBarier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。
- 默认的构造方法是
CyclicBarrier(int parties)
,其参数表示屏障拦截的线程数量,每个线程调用 await 方法告诉 CyclicBarrier 已经到达屏障位置,线程被阻塞。 另外一个构造方法
CyclicBarrier(int parties, Runnable barrierAction)
,其中 barrierAction 任务会在所有线程到达屏障后执行。await()
: 参与者在所有的参与者都已经在此 barrier 上调用await
方法之前一直等待
案例
集齐7颗龙珠就可以召唤神龙
1 |
|
3. 信号量 Semaphore
一个计数信号量,从概念上讲,信号量维护了一个许可集,如有必要,在许可可用前会阻塞每一个 acquire()
,然后再获取该许可。每个 release()
添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动
Semaphore 通常用于限制可以访问某些资源的线程数目
常用的构造方法
Semaphore(int permits)
创建具有给定许可数和非公平设置的SemaphoreSemaphore(int permits, boolean fair)
常用方法
acquire()
从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断release()
释放一个许可,将其返回给信号量
案例
6辆汽车,停3个车位
1 |
|