Java JUC锁—工具类(CountDownLatch/CyclicBarrier/Semaphore/Exchanger/Phaser)
一、同步计数器CountDownLatch
1. 定义:使一个线程等待其他线程各自执行完毕后再执行。
是通过一个计数器来实现的,计数器初始值为线程的数量,每当一个线程执行完毕后,计数器的值就减1,当计数器的值为0时,表示所有的线程都执行完毕,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务,缺点是只能使用一次。
2. 常用API
A. CountDownLatch(int count):构造方法,创建一个值为count的计数器;
B. await():阻塞当前线程,将当前线程加入阻塞队列;
C. await(long timeout, TimeUnit unit):在timeout的时间之内阻塞当前线程,时间一过则当前线程可以执行;
D. countDown():对计数器进行递减1操作,当计数器递减至0时,当前线程会去唤醒阻塞队列里的所有线程;
3. 应用场景
A. 某一个线程在开始运行前等待n个线程执行完毕;
B. 实现多个线程开始执行任务的最大并行性。
4. 实例
二、循环栅栏CyclicBarrier
1. 定义:让所有线程都等待完成后才进行下一步行动。
2. 常用API
A. CyclicBarrier(int parties):当给定数量的线程等待它时,它将跳闸,并且当屏障跳闸时不执行预定义的动作;
B. await():等待所有parties已经在这个障碍上调用了await;
C. reset():将屏障重置为初始状态;
3. CountDownLatch与CyclicBarrier区别
A. CountDownLatch是线程组之间的等待,即一个(或多个)线程等待N个线程完成某件事情之后再执行;而CyclicBarrier则是线程组内的等待,即每个线程相互等待,即N个线程都被拦截之后,然后依次执行;
B. CountDownLatch是减计数方式,而CyclicBarrier是加计数方式;
C. CountDownLatch计数为0无法重置,而CyclicBarrier计数达到初始值,则可以重置;
D. CountDownLatch不可以复用,而CyclicBarrier可以复用;
4. 应用场景
A. 某一个线程在开始运行前等待n个线程执行完毕;
5. 实例
三、信号量Semaphore
1. 定义:是一个计数器,用来保护一个或多个共享资源的访问,要想访问必须拿到许可证,使用完毕释放许可证;
2. 常用API
A. Semaphore(int permits):非公平模式指定最大允许访问许可证数量;
B. acquire():从信号量获取一个许可,如果无可用许可前将一直阻塞等待;
C. release():释放一个许可,别忘了在finally中使用;
3. 应用场景
A. 限制获取某种资源的线程数量;
B. 接口限流;
4. 实例
四、交换者Exchanger
1. 定义:指两个线程在运行过程中需要交换彼此的信息,前提是达到提供的同步点才可以交换数据,第一个先拿出数据的线程会一直等待第二个线程,直到第二个线程拿着数据到来时才能彼此交换对应数据,注意等待的线程是被挂起,而到达的线程会唤醒等待的线程;
2. 常用API
A. Exchanger():无参构造方法;
B. V exchange(V x):等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象;
C. V exchange(V x, long timeout, TimeUnit unit):等待另一个线程到达此交换点(除非当前线程被中断或超出了指定的等待时间),然后将给定的对象传送给该线程,并接收该线程的对象;
3. 应用场景
A. 遗传算法;
B. 校对工作;
C. 流水线设计;
4. 实例
五、Phaser
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗