闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态。闭锁的作用相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有
任何线程能通过,当到达结束状态时,这扇门会打开并允许所有的线程通过。当闭锁到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开状态。
闭锁可以用来确保某些活动直到其他活动都完成后才继续执行。
CountDownLatch是一种灵活的闭锁实现,可以在上述各种情况中使用,它可以使一个或多个线程等待一组事件发生。闭锁状态包括一个计数器,该计数器
被初始化为一个正数,表示需要等待的事件数量。countDown方法递减计数器,表示有一个事件已经发生了,而await方法等待计数器达到零,这表示所有
需要等待的事件都已经发生。如果计数器的值非零,那么await会一直阻塞直到计数器为零,或者等待中的线程中断,或者等待超时。
public class TestHarness { public long timeTasks(int nthreads, final Runnable task) throws InterruptedException { final CountDownLatch startGate = new CountDownLatch(1); final CountDownLatch endGate = new CountDownLatch(nthreads); for (int i = 0; i < nthreads; i++) { Thread t = new Thread(){ @Override public void run() { try{ startGate.await(); try{ task.run(); }finally { endGate.countDown(); } } catch (InterruptedException ignored) {} } }; t.start(); } long start = System.nanoTime(); startGate.countDown(); endGate.await(); long end = System.nanoTime(); return end-start; } }
startGate计数器的初始值为1,而endGate计数器的初始值为工作线程的数量。每个工作线程首先要做的就是在startGate上等待,从而确保所有线程都就绪后
才开始执行。而每个线程要做的最后一件事情是将调用endGate的countDown方法减1,这能使主线程高效地等待直到所有工作线程都执行完成,因此可以更准确
地统计所消耗的时间
ps. 为什么要在上例中使用闭锁,而不是在线程创建后就立即启动?或许,我们希望测试n个线程并发执行某个任务时需要的时间。如果在创建线程后立即启动
它们,那么先启动的线程将“领先”后启动的线程,并且活跃线程数量会随着时间的推移而增加或减少,竞争程度也在不断发生变化。
相关推荐
Phaser 是一个更加灵活的同步工具类,可以用来实现复杂的同步逻辑。Phaser 可以注册多个 partiecipants,每个 partiicipant 可以在 Phaser 中注册,Phaser 会等待所有 partiicipants 都执行完毕后,再执行下一步操作...
CountDownLatch是Java并发编程中一个重要的同步工具类,它由Java 1.5引入,位于`java.util.concurrent`包下。这个工具类主要用于协调多个线程间的协作,使得某个线程(或一组线程)必须等待其他线程完成指定的任务后...
Java并发系列之CountDownLatch源码分析 CountDownLatch是一种非常有用的工具类,用于拦截一个或多个线程,使其在某个条件成熟后再执行。它的内部提供了一个计数器,在构造闭锁时必须指定计数器的初始值,且计数器的...
在Java并发编程中,闭锁和栅栏是两种重要的同步工具,它们可以帮助开发者在多线程环境下控制线程的执行顺序和同步。本篇文章将详细解释这两种机制,并通过实例代码进行演示。 一、闭锁(CountDownLatch) 闭锁,由...
Java并发编程中的闭锁是一种同步工具类,它用于协调多个线程之间的操作顺序,确保一组操作在所有线程完成之前不会继续。闭锁的核心概念是一个内部计数器,初始值为一个正整数,表示需要等待的事件数量。当这个计数器...
在Java中,主要有两种同步机制:内置的`synchronized`关键字以及基于`java.util.concurrent`包中的高级同步工具类。本文将深入探讨这些机制的底层实现,特别是通过`AbstractQueuedSynchronizer`(AQS)来理解`...
- `ExecutorService`接口的主要实现类之一,提供了丰富的配置选项,如核心线程数、最大线程数、空闲线程存活时间等。 #### 五、并发工具类 - **CountDownLatch**: - 计数器闭锁,允许一个或多个线程等待其他...
TestHarnes->在计时测试中使用CountDownLatch(闭锁)来启动和停止线程 Preloader->使用FutureTask来提前加载稍后需要的数据 BoundedHashSet->使用Semaphore为容器设置边界 CellularAutomata->通过CyclicBarrier...
3. 各种并发工具类:包括闭锁(CountDownLatch)、栅栏(CyclicBarrier)、信号量(Semaphore)、读写锁(ReentrantReadWriteLock)等,这些工具类提供了丰富的线程间协调和控制的机制,使得多线程之间的合作更加...
- **闭锁**(CountDownLatch):一次性计数器,用于等待其他线程完成操作。 - **栅栏**(CyclicBarrier):一组线程达到某个点时才继续执行。 - **Fork/Join框架**:用于解决大问题的分割和并行处理。 7. **...
12. 闭锁 CountDownLatch 13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService ...
12. 闭锁 CountDownLatch 13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService ...
- `CountDownLatch`:倒计时闭锁。 28. **`wait()` 和 `sleep()` 的区别**: - `wait()` 会释放对象的锁,而 `sleep()` 不会。 - `wait()` 需要在同步上下文中使用,而 `sleep()` 可以在任何地方使用。 29. **`...
闭锁 CountDownLatch 13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19....
12. 闭锁 CountDownLatch 13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService ...
- **tools部分**:同步工具类,如`Semaphore`(信号量)、`CountDownLatch`(闭锁)和`CyclicBarrier`(栅栏)。 #### 二、并发容器详解 并发容器是Java并发编程中的重要组成部分,它们提供了比传统集合类更强大的...
Java并发编程中的栅栏(CyclicBarrier)是一个同步辅助类,它允许一组线程等待彼此到达某个特定点,然后一起继续执行。这个特定点被称为屏障点。与闭锁(CountDownLatch)不同,闭锁通常是一次性的,而CyclicBarrier...
- **闭锁(CountDownLatch)** 允许一个或多个线程等待其他线程完成操作。计数器初始化为n,调用`countDown()`方法会使计数器减一,直到计数器为0时,所有等待的线程才能继续执行。 - **FutureTask** 是一个实现了...