当前位置: 首页 > wzjs >正文

网站建设行业发展趋势东营信息网

网站建设行业发展趋势,东营信息网,贵阳百度公司建网站电话,长春网站改版引言 CountDownLatch 是 Java 并发包 java.util.concurrent 中的一个同步工具类,由著名的并发编程大师 Doug Lea 所开发。它允许一个或多个线程等待其他线程完成操作后再继续执行,其核心思想是通过一个计数器,对计数器进行调度来实现 原理 …

引言

CountDownLatch 是 Java 并发包 java.util.concurrent 中的一个同步工具类,由著名的并发编程大师 Doug Lea 所开发。它允许一个或多个线程等待其他线程完成操作后再继续执行,其核心思想是通过一个计数器,对计数器进行调度来实现

原理

CountDownLatch 初始化时会设置一个计数器的值,该值表示需要等待完成的操作数量。每当一个线程完成了自己的任务后,会调用 countDown() 方法将计数器减 1。当计数器的值变为 0 时,意味着所有需要等待的操作都已完成,此时在 await() 方法上等待的线程将被唤醒,继续执行后续操作。

源码分析

内部类

private final Sync sync;private static final class Sync extends AbstractQueuedSynchronizer {private static final long serialVersionUID = 4982264981922014374L;Sync(int count) {setState(count);}int getCount() {return getState();}protected int tryAcquireShared(int acquires) {return (getState() == 0) ? 1 : -1;}protected boolean tryReleaseShared(int releases) {// Decrement count; signal when transition to zerofor (;;) {int c = getState();if (c == 0)return false;int nextc = c-1;if (compareAndSetState(c, nextc))return nextc == 0;}}
}
  • sync:CountDownLatch 内部使用 Sync 类的实例,Sync 继自 AbstractQueuedSynchronizer(AQS),借助 AQS 的状态(state)来表示计数器的值。
  • Sync 类:
    • 构造函数 Sync(int count):在创建 Sync 实例时,会调用 setState(count) 方法将 AQS 的状态初始化为传入的计数器值。
    • getCount() 方法:返回 AQS 的当前状态,即计数器的当前值。
    • tryAcquireShared(int acquires) 方法:用于尝试以共享模式获取锁。当计数器值为 0 时返回 1,表示可以获取锁;否则返回 -1,表示无法获取锁。
    • tryReleaseShared(int releases) 方法:用于尝试以共享模式释放锁。使用 for(;;) 无限循环结合 compareAndSetState 方法(CAS 操作)来安全地将计数器减 1。当计数器减为 0 时返回 true,表示释放成功且可以唤醒等待线程;否则返回 false。

结合源码我们一般是主线程设计为等待线程,线程池去完成计数器的增减

内部方法

await()

public void await() throws InterruptedException {sync.acquireSharedInterruptibly(1);
}
  • await() 方法会调用 sync 的 acquireSharedInterruptibly(1) 方法,该方法是 AQS 提供的以共享模式获取锁的可中断方法。其具体逻辑为:
    • 检查当前线程是否被中断,若被中断则抛出 InterruptedException 异常。

    • 调用 tryAcquireShared 方法尝试获取锁,若计数器为 0 则获取成功,线程继续执行;否则将当前线程放入等待队列并阻塞。

await(long timeout, TimeUnit unit) 

public boolean await(long timeout, TimeUnit unit)throws InterruptedException {return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
}

该方法允许线程等待指定的时间。调用 sync 的 tryAcquireSharedNanos(1, unit.toNanos(timeout)) 方法,在指定时间内尝试以共享模式获取锁。若在超时时间内计数器变为 0 则返回 true;若超时则返回 false。

countDown() 

countDown() 方法调用 sync 的 releaseShared(1) 方法,以共享模式释放锁。该方法会调用 tryReleaseShared 方法尝试将计数器减 1,若减为 0 则唤醒所有在等待队列中的线程。

实战

下面是多线程实战CountDownlatch,依旧是主线程等待,在循环中创建线程调用await方法

import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public static void main(String[] args) throws InterruptedException {// 创建一个 CountDownLatch 实例,计数器初始值为 3CountDownLatch latch = new CountDownLatch(3);// 创建并启动三个工作线程for (int i = 0; i < 3; i++) {final int workerId = i;new Thread(() -> {try {System.out.println("Worker " + workerId + " is working.");// 模拟工作Thread.sleep((long) (Math.random() * 1000));System.out.println("Worker " + workerId + " has finished.");} catch (InterruptedException e) {e.printStackTrace();} finally {// 工作完成,计数器减 1latch.countDown();}}).start();}// 主线程等待所有工作线程完成System.out.println("Main thread is waiting for workers to finish.");latch.await();System.out.println("All workers have finished. Main thread can continue.");}
}

http://www.dtcms.com/wzjs/612018.html

相关文章:

  • 网站制作语言wordpress用户登录地址
  • 平湖网站建设公司克建立网站谁给你钱
  • 东莞网上推广怎么做seo做的比较好的网站的几个特征
  • 呼和浩特网站建设哪家最便宜建e
  • 网站备案添加域名绍兴seo计费管理
  • 公司注册网站多少钱网站建设如何把更改内容
  • 哪家企业做网站好中国咖啡网站建设方案
  • 做计算机网站有哪些功能网站建设可行性方案
  • 如何做网站公司名seowordpress转盘抽奖源码
  • 网站加载慢图片做延时加载有用合肥做网站的公司有哪些
  • 网站开发进入腾信职位做ipo尽调需要用到的网站
  • 商用图片的网站做返利网站能赚钱
  • 深圳专业做网站和seo的公司免费做app的软件有哪些
  • 企业网站设计的重要性网络系统建设方案
  • 番禺网站建设部招标网站
  • 万江网站制作python安装wordpress
  • 哪个地方旅游网站做的比较好微信公众号里的小网站怎么做的
  • 网站模块顺序调整做任务的网站有哪些
  • wordpress做小程序灯塔seo
  • 海南省建设考试网站首页广州网站推广平台
  • 北京微信网站制作电话做视频网站推广
  • 国内优秀的设计网站推荐有利于seo的网站底部
  • 诸城网站建设费用电商卖货平台
  • 有了域名后怎么做网站百度公司推广电话
  • vs 2015可以做网站吗做调查问卷网挣钱的网站
  • 想不到的网站域名新品牌推广策划方案
  • 网站内容建设和管理系统公司logo查询网站
  • 科技公司内蒙古网站制作北京企业建站服务中企
  • 公司网站设计维护网站安全漏洞扫描工具
  • dream网站怎么做框架网站 搜索引擎 提交