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

广西建设厅考试网站阿里巴巴做外贸的网站

广西建设厅考试网站,阿里巴巴做外贸的网站,wordpress简洁主题,南京h5 网站建设文章目录 类图及概要核心方法await() 方法await(long timeout, TimeUnit unit) 方法countDown() 方法getCount() 方法 总结 类图及概要 CountDownLatch 内部有个计数器,并且这个计数器是递减的 。 下面就通过源码看看 JDK 开发组在何时初始化计数器,在何…

文章目录

  • 类图及概要
  • 核心方法
    • await() 方法
    • await(long timeout, TimeUnit unit) 方法
    • countDown() 方法
    • getCount() 方法
  • 总结

类图及概要

CountDownLatch 内部有个计数器,并且这个计数器是递减的 。 下面就通过源码看看 JDK 开发组在何时初始化计数器,在何时递减计数器,当计数器变为 0 时做了什么操作, 多个线程是如何通过计时器值实现同步的 。

在这里插入图片描述
从类图可以看出, CountDownLatch 是使用 AQS 实现的 。 通过下面的构造函数,你会发现,实际上是把计数器的值赋给了 AQS 的状态变量 state,也就是这里使用 AQS 的状态值来表示计数器值。

``

public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException(“count < 0”);
this.sync = new Sync(count);
}

Sync(int count) {
setState(count);
}

``

核心方法

await() 方法

当线程调 用 CountDownLatch 对象的 await 方法后 , 当前线程会被 阻塞 , 直到下面的情况之一发生才会返回 : 当所有线程都调用了 CountDownLatch 对象的 countDown 方法后,也就是计数器的值为 0 时;其他线程调用了当前线程的 interrupt ()方法中断了当前线程 ,当前线程就会抛出InterruptedException 异常 , 然后返回。

``

public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}

public final void acquireSharedInterruptibly(int arg)
throws InterruptedException {
// 如果线程被中断则抛出异常
if (Thread.interrupted())
throw new InterruptedException();
// 查看当前计数器千直是否为 0 , 为 0 则直接返回 , 否则进入AQS的队列等待
if (tryAcquireShared(arg) < 0)
doAcquireSharedInterruptibly(arg);
}

// sync类实现的 AQS 的接口
protected int tryAcquireShared(int acquires) {
return (getState() == 0) ? 1 : -1;
}

``
await() 方法委托 sync 调用 了 AQS 的 acquiresharedInterruptibIy方法 。

该方法 的特点是线程获取资源时可 以被中 断, 并且获取 的资源是共享资源。 acquireSharedlnterruptibly 首先判断当前线程是否己被中断 , 若是则抛出异常,否则调用 sync 实现 的 tryAcquireShared 方法查看当前状态值( 计数器值)是否为 0 , 是则当前线程 的 await() 方法直接返回 , 否 则调用 AQS 的doAcquireSharedlnterruptibly 方法让当前线程阻塞。另外可 以看到,这里tryAcquireShared 传递的 arg 参数没有被用 到, 调用tryAcquireShared 的方法仅仅是为了检查当前状态值是不是为 0 , 并没有调用 CAS 让 当 前状态值减 1 。

await(long timeout, TimeUnit unit) 方法

当线程调用了 CountDownLatch 对象 的该方法后 , 当前线程会被阻塞 , 直到下面的情况之一发生才会返回:当 所有线程都调用了 CountDownLatch 对象 的 countDown 方法后 ,也就是计数器值为 0 时 ,这时候会返 回 true ;设置的 timeout 时间到了,因为超时而返回false ; 其他线程调用了当前线程的 interrupt ( )方法中断了当前线程 , 当前线程会抛出InterruptedException 异常,然后返回。

countDown() 方法

线程调用该方法后 ,计数器的值递减 , 递减后如果计数器值为 0 则唤醒所有因调用await 方 法而被阻塞的线程,否则什么都不做。下面看下 countDown() 方法是 如何调用AQS 的方法的。

``

public void countDown() {
// 委托sync调 用 AQS的方法
sync.releaseShared(1);
}

public final boolean releaseShared(int arg) {
// 调用 sync 实现的 tryReleaseShared
if (tryReleaseShared(arg)) {
// AQS 的释放资源方法
doReleaseShared();
return true;
}
return false;
}

``

CountDownLatch 的 countDown ( )方法委 托 sync 调用了 AQS 的releaseShared 方法。

re leaseShared 首先调用了 sync 实现的 AQS 的 tryReleaseShared 方法。

``

protected boolean tryReleaseShared(int releases) {

        // 循环进行CAS ,直到当前线程成功完成CAS使计数器值(状态值state )减 1并更新到statefor (;;) {int c = getState();// 如果当前状态值为0则直接返回( 1 )if (c == 0)return false;// 使用 CAS让计数器佳减 1 ( 2)int nextc = c-1;if (compareAndSetState(c, nextc))return nextc == 0;}

}

``

如上代码首先获取当前状态值(计数器值) 。 代码 (1) 判断如果当前状态值为 0 则直接返回 false,从而 countDown ( )方法直接返回:否则执行码 (2) 使用 CAS 将计数器值减 1, CAS 失败则循环重试,否则如果当前计数器值为 0 则返回 true,返回 true 说明是最后一个线程调用的 countdown 方法,那么该线程除了让计数器值减 1 外,还需要唤醒因调用 CountDownLatch 的 await 方法而被阻塞的线程,具体是调用 AQS 的 doReleaseShared方法来激活阻塞的线程。这里代码 (1) 貌似是多余的,其实不然,之所以添加代码 (1) 是为了防止当计数器值为 0 后,其他线程又调用了 countDown 方法,如果没有代码 (1) 状态值就可能会变成负数。

getCount() 方法

获取当前计数器的值,也就是 AQS 的 state 的值,在其内部还是调用了 AQS 的 getState 方法来获取 state 的值(计数器当前值)。

``

public long getCount() {
return sync.getCount();
}

int getCount() {
return getState();
}

``

总结

使用 AQS 的状态变量来存放计数器 的值。首先在 初始化CountDownLatch 时设置状态值(计数器值),当多个线程调用 countdown 方法时实际是原子性递减 AQS 的状态值。当线程调用 await 方法后当前线程会被放入 AQS 的阻塞队列等待计数器为 0 再返 回 。其他线程调用 countdown 方法让计数器值递减 1 ,当计数器值变为0 时, 当 前线程还要调用 AQS 的 doReleaseShared 方法来激活由于调用 await() 方法而被阻塞的线程 。


文章转载自:

http://dAmBYYSs.tymwx.cn
http://O3fNWtIL.tymwx.cn
http://LnjbFs0p.tymwx.cn
http://NWqOgEkt.tymwx.cn
http://HTYIwMXf.tymwx.cn
http://zZQ6wfuG.tymwx.cn
http://x9KDwqqA.tymwx.cn
http://nW4GjdEl.tymwx.cn
http://pdV4qu7J.tymwx.cn
http://9iAPMDXT.tymwx.cn
http://PPBJG6T3.tymwx.cn
http://0e7Esptm.tymwx.cn
http://2rWFBSfC.tymwx.cn
http://R8nGwThk.tymwx.cn
http://MYayEMei.tymwx.cn
http://Nf0RzbMj.tymwx.cn
http://d2ORn9ZF.tymwx.cn
http://dC0bWVHu.tymwx.cn
http://0wI7DoXO.tymwx.cn
http://BWJLjmqH.tymwx.cn
http://vjAsxxKy.tymwx.cn
http://wZRQrI8N.tymwx.cn
http://RL8uUXaN.tymwx.cn
http://DQA6zM4n.tymwx.cn
http://uVUWYpfZ.tymwx.cn
http://ZxfSk6KE.tymwx.cn
http://DbM6vO9X.tymwx.cn
http://1nXzG8dx.tymwx.cn
http://dfTLy9OL.tymwx.cn
http://UkpGPvdF.tymwx.cn
http://www.dtcms.com/wzjs/725980.html

相关文章:

  • 宁波外贸网站建设和推广个人网站备案备注
  • 有了网站模板 还要怎样做网站开发语言有那些
  • 长沙建站宝网络科技有限公司如何把网页字体转换为wordpress
  • 佛山网站推广优化做网站如何收益
  • 鄂州第一官方网站开发板种类
  • 泗洪网站wordpress 主题删除
  • 网站备案需要多长时间企业内部的网站系统
  • 如何做自己官方网站学校网站建设方法
  • 山东住房和城乡建设局网站首页wordpress商店
  • WordPress大前端top攀枝花seo
  • 网站没有流量怎么办模板网页设计视频
  • 毕业设计做课程网站好vi设计都包括什么
  • 英铭长沙网站建设手机网站建设知识
  • 网站app开发费用毕业去设计公司还是企业
  • WordPress如何禁止游客访问专业做网站优化需要多久
  • 响应式网站怎么改万网怎样做网站调试
  • 营业执照包含网站开发建设品牌型网站
  • 做书的网站有哪些用asp做的网站
  • 建设银行征信中心网站单位做网站支出应怎么核算
  • 企?I网站建站 ?V州 ??lwordpress社交系统
  • 一流的镇江网站建设做网站一定要效果图吗
  • 网站开发遇到的风险潍坊网站公司网络科技
  • 软件开发培训中心重庆谷歌seo关键词优化
  • 网站建设的最终目标网站推广效益怎么分析
  • 浙江省住建和城乡建设厅官方网站wordpress 2.0漏洞
  • 晋中市两学一做网站html5 音乐网站
  • 淘金企业网站建设服务商丘seo快速排名
  • 营销网站做推广公司关键词seo培训
  • 上海婚恋网站排名长春网站公司
  • 网站服务器租赁需要什么手续吉林省建设工程质量监督站网站