CountDownLatch
什么是CountDownLatch?
CountDownLatch就像一个倒计时的门闩。它允许一个或多个线程等待,直到其他线程完成一组操作。
如何工作?
- 初始化:设置一个计数器,初始值为你希望等待的事件数量。
- 倒计时:每当一个事件完成,计数器就减一。
- 等待:主线程或者其他线程会等待,直到计数器减到零。
举个例子
想象一下,你和几个小伙伴决定一起去看电影,但必须等所有人都到齐才能出发。你们可以用CountDownLatch来实现:
- 初始化:设置计数器为小伙伴的总数,比如5。
- 倒计时:每来一个小伙伴,计数器减一。
- 等待:主线程(你)会一直等,直到计数器减到零(所有小伙伴都到齐)。
使用场景
- 等待多个线程完成初始化工作,然后再一起开始执行主任务。
- 实现某个线程等待其他线程完成一组任务。
CyclicBarrier
什么是CyclicBarrier?
CyclicBarrier就像一个栅栏,所有线程都必须在栅栏前集合,等大家都到齐了,栅栏才会打开,所有线程一起继续执行。
如何工作?
- 初始化:设置一个障碍点,指定需要等待的线程数量。
- 等待:所有线程都会在障碍点等待,直到指定数量的线程都到达。
- 继续执行:当所有线程都到达障碍点后,栅栏打开,所有线程继续执行。
举个例子
想象你和几个小伙伴在玩接力赛,每一轮都要等所有人都到达终点才能开始下一轮。你们可以用CyclicBarrier来实现:
- 初始化:设置障碍点,指定需要等待的小伙伴数量,比如5。
- 等待:所有小伙伴都到达终点,栅栏打开。
- 继续执行:所有小伙伴继续下一轮比赛。
使用场景
- 多线程协作,所有线程在某个点集合,然后一起继续执行。
- 实现分阶段任务,每个阶段都需要所有线程完成才能进入下一个阶段。
Semaphore
什么是Semaphore?
Semaphore就像一个停车场的限流器,用来控制同时访问某个资源的线程数量。
如何工作?
- 初始化:设置一个许可数,表示可以同时访问资源的最大线程数。
- 获取许可:线程在访问资源前,必须先获取一个许可。
- 释放许可:线程访问完资源后,必须释放许可。
举个例子
想象你有一个停车场,最多只能停10辆车。你可以用Semaphore来实现:
- 初始化:设置许可数为10。
- 获取许可:每来一辆车,获取一个许可。
- 释放许可:每离开一辆车,释放一个许可。
使用场景
- 控制对共享资源的访问,比如数据库连接池、限流等。
- 实现资源的限量访问,防止资源耗尽。
小结
- CountDownLatch:用于一个或多个线程等待其他线程完成一组操作。
- CyclicBarrier:用于一组线程在某个点集合,然后一起继续执行。
- Semaphore:用于控制同时访问某个资源的线程数量。