CountDownLatch、CyclicBarrier、Semaphore区别?
1 个回答
在漆黑的夜里,你需要一道光照亮夜行的路,我燃烧了我自己,但也造就了你我不能相拥。蚂蚱#### 1. **基本概念** 1. **CountDownLatch(倒计时锁存器)**: - 用来让一个线程等待其他线程完成各自的任务后再继续执行。 - 通过一个计数器来实现,当计数器的值减到 0 时,所有等待的线程才会继续执行。 2. **CyclicBarrier(循环屏障)**: - 用来让一组线程到达一个屏障点后再统一继续执行。 - 类似于集体活动,必须等所有人都到齐后才能开始。 3. **Semaphore(信号量)**: - 用来控制对共享资源的访问数量。 - 通过许可证(permits)的数量限制线程的并发访问,线程需要获取许可证才能执行操作,完成后需要释放许可证。 #### 2. **主要区别** | 特性 | CountDownLatch | CyclicBarrier | Semaphore | |-------------------|------------------------------------------|-----------------------------------------|-----------------------------------------| | **用途** | 等待其他线程完成任务 | 等待一组线程共同到达屏障点 | 控制访问共享资源的并发数量 | | **计数器** | 单次使用,计数器值只能减为 0 后结束 | 可重复使用,每次达到屏障点后重置 | 动态增减许可数量 | | **线程协作** | 主线程等待其他线程完成 | 线程相互等待,所有线程到齐后继续 | 通过许可证控制线程访问资源 | | **是否可重复使用** | 否 | 是 | 是 | #### 3. **使用场景** 1. **CountDownLatch**: - 用于 **一个线程等待多个线程完成任务** 的场景。 - 例如:主线程等待多个工作线程完成计算后,汇总结果。 2. **CyclicBarrier**: - 用于 **多线程相互等待,达到一个共同的屏障点后继续** 的场景。 - 例如:模拟赛跑,所有运动员准备好后统一开始。 3. **Semaphore**: - 用于 **限制对共享资源的并发访问数量**。 - 例如:限制同时访问某个数据库连接的线程数量。 #### 4. **代码示例** **CountDownLatch 示例**: ```java CountDownLatch latch = new CountDownLatch(3); for (int i = 0; i < 3; i++) { new Thread(() -> { System.out.println(Thread.currentThread().getName() + "完成任务"); latch.countDown(); }).start(); } try { latch.await(); // 等待计数器减为 0 System.out.println("所有任务完成,主线程继续"); } catch (InterruptedException e) { e.printStackTrace(); } ``` **CyclicBarrier 示例**: ```java CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("所有线程到达屏障点,开始执行")); for (int i = 0; i < 3; i++) { new Thread(() -> { try { System.out.println(Thread.currentThread().getName() + "到达屏障点"); barrier.await(); // 等待其他线程到达屏障点 } catch (Exception e) { e.printStackTrace(); } }).start(); } ``` **Semaphore 示例**: ```java Semaphore semaphore = new Semaphore(2); // 允许同时访问的线程数量为 2 for (int i = 0; i < 5; i++) { new Thread(() -> { try { semaphore.acquire(); // 获取许可证 System.out.println(Thread.currentThread().getName() + "获取资源"); Thread.sleep(1000); // 模拟操作 semaphore.release(); // 释放许可证 System.out.println(Thread.currentThread().getName() + "释放资源"); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } ``` #### 5. **总结** - **CountDownLatch**:一个线程等待多个线程完成任务,适合 **单次使用**。 - **CyclicBarrier**:多个线程相互等待,适合 **循环使用**。 - **Semaphore**:控制并发线程数,适合限制共享资源的访问。发布于 2025-01-23 00:44 •IP属地 安徽举报评论收藏
公众号进入网站体验更佳

