多线程(十二、AQS原理-CountDownLatch基于AQS的共享实现)
1、Thread-1执行await,等待主线程放行;
2、Thread-2执行await,等待主线程放行;
3、主线程执行countDown()放行。
1、CountDownLatch的初始计数器就是直接设置AQS的同步状态值state
2、countDown就是对state执行减1
3、当state为0的时候,放行。
只要state是0,则所有获取资源的申请都会成功,这就是共享锁的含义。
3.2.3 如果主线程不放行,state不等于0,,申请失败,会执行doAcquireSharedInterruptibly此时,自旋获取一次也会失败,会进行阻塞,进入【等待队列】
3.3 Thread-2调用await,结果同上,Thread-2也进入【等待队列】3.4 主线程放行countDown()3.4.1 countDown()tryReleaseShared方法然后执行doReleaseShared,唤醒Thread-1Thread-1被唤醒后,从阻塞的地方继续执行,重新获取资源,此时state=0,则会获取成功然后执行:setHeadAndPropagate方法把ThreadA结点变为头结点,并根据传播状态判断是否要唤醒并释放后继结点private void setHeadAndPropagate(Node node, int propagate) { Node h = head; // Record old head for check below setHead(node);//设置当前节点为头节点 if (propagate > 0 || h == null || h.waitStatus < 0 || (h = head) == null || h.waitStatus < 0) { Node s = node.next; if (s == null || s.isShared()) //后继节点如果是共享的,则依次唤醒后继节点,这就是共享的原理 doReleaseShared(); } }
3.5 Thread-1会继续唤醒Thread-2,Thread-2继续执行,会继续唤醒后续共享节点,此时后面没有节点了,程序完成。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。