人物设计网站各大知名网站开发语言
2026/4/18 8:25:15 网站建设 项目流程
人物设计网站,各大知名网站开发语言,上海网站建设哪里便宜,大良网站公司CountDownLatch 是 Java 并发包#xff08;java.util.concurrent#xff09;中一个非常经典且实用的同步工具类#xff0c;由 Doug Lea 设计。它的核心思想是#xff1a;让一个或多个线程等待#xff0c;直到其他线程完成一组操作#xff08;“倒计时归零”#xff09;后…CountDownLatch是 Java 并发包java.util.concurrent中一个非常经典且实用的同步工具类由 Doug Lea 设计。它的核心思想是让一个或多个线程等待直到其他线程完成一组操作“倒计时归零”后再继续执行。下面从设计意图、内部实现、使用场景、内存语义四个维度帮你彻底理解它。一、设计意图解决什么问题场景1主线程等所有子任务完成启动 N 个 worker 线程去处理任务。主线程不能继续必须等这 N 个都做完。✅CountDownLatch初始化为 N每个 worker 完成后调用countDown()主线程调用await()等待。场景2所有线程同时启动“发令枪”所有 worker 线程先启动但卡在await()。主线程准备就绪后调用countDown()初始 count1所有 worker 同时开始。✅ 这就是“门闩”latch或“栅栏”的作用。关键特性一次性one-shot计数器只能从 N 减到 0不能重置。如果你需要重复使用比如循环等待请用CyclicBarrier。二、内部实现基于 AQS 的共享模式CountDownLatch的核心是内部类Sync它继承自AbstractQueuedSynchronizerAQS。1. 状态表示setState(count);// AQS 的 state 字段 倒计数值state 0还有任务未完成调用await()的线程要阻塞。state 0所有任务完成所有等待线程被释放。2. 获取await—— 共享模式protectedinttryAcquireShared(intacquires){return(getState()0)?1:-1;}返回1表示获取成功可以通行。返回-1表示获取失败需要排队等待。注意只要state 0所有调用await()的线程都能立即通过→ 这就是共享模式的体现3. 释放countDown—— 共享释放protectedbooleantryReleaseShared(intreleases){for(;;){intcgetState();if(c0)returnfalse;// 已经归零无需再释放intnextcc-1;if(compareAndSetState(c,nextc))returnnextc0;// 只有归零时才触发唤醒}}使用 CAS 循环安全地减 1。只有当nextc 0时才返回true通知 AQS“现在可以唤醒所有等待者了”4. 唤醒机制当countDown()使计数归零时AQS 会调用doReleaseShared()你之前问过的那个方法。因为是共享模式所有等待线程都会被连续唤醒传播机制确保不漏掉。✅ 所以CountDownLatch是 AQS共享模式的经典应用。三、典型使用方式结合你的代码注释示例1发令枪 完成信号CountDownLatchstartSignalnewCountDownLatch(1);// 所有工人等“开始”信号CountDownLatchdoneSignalnewCountDownLatch(N);// 主线程等“完成”信号// 启动 N 个工人for(inti0;iN;i)newThread(()-{startSignal.await();// 阻塞直到 startSignal.countDown()doWork();doneSignal.countDown();// 完成一个计数减1}).start();doSomethingElse();// 主线程做准备工作startSignal.countDown();// 发令所有工人开始doneSignal.await();// 等待所有工人完成示例2并行任务汇总ExecutorServiceexecExecutors.newFixedThreadPool(4);CountDownLatchlatchnewCountDownLatch(10);for(inti0;i10;i){exec.submit(()-{try{process(i);}finally{latch.countDown();// 必须保证执行}});}latch.await();// 等待全部10个任务完成exec.shutdown();⚠️ 注意countDown()通常放在finally块中防止异常导致计数不减造成死锁。四、内存可见性Memory ConsistencyJava 内存模型JMM保证在某个线程调用countDown()之前的所有操作对在await()成功返回后的线程是可见的。即happens-before 关系成立。这意味着Worker 线程写入的数据如计算结果到共享变量在主线程await()返回后一定能读到最新值。✅ 无需额外加volatile或synchronized五、与 CyclicBarrier 的区别特性CountDownLatchCyclicBarrier是否可重用❌ 一次性✅ 可重复使用触发条件计数归零所有线程到达屏障点谁等待任意线程通常是协调者所有参与线程互相等待典型用途等待 N 个任务完成 / 发令枪多线程迭代同步如并行计算每轮同步六、总结一句话理解 CountDownLatch它是一个“倒计时门闩”门关着count 0所有想通过的线程调用 await都得等着每有人完成一件事countDown计数减一当计数归零门打开所有等待者一拥而过且之后来的人直接通行。它的强大之处在于简单、高效、线程安全利用 AQS 共享模式实现“一对多”或“多对一”的同步提供明确的内存可见性保证。这也是为什么它成为并发编程中的“瑞士军刀”之一。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询