JUC代码浅析[5]——基于AQS的CountDownLatch
CountDownLatch是一种使线程等待一组其他线程操作完成再开始的同步方式,初始化时设置一个计数值,每完成一次操作后countDown()对计数值减操作,线程等待await()直到计数值为0。
为了说明使用场景拷贝了代码注释中的例子,
class Driver {
// ...
void main() throws InterruptedException {
CountDownLatch startSignal = new
CountDownLatch(1);
CountDownLatch doneSignal = new
CountDownLatch(N);
for (int i = 0; i < N; ++i) // create
and start threads
new Thread(new Worker(startSignal,
doneSignal)).start();
doSomethingElse();
startSignal.countDown(); // 所有的worker线程开始
doSomethingElse();
doneSignal.await(); // 等待doneSignal计数值为0
}
}
class Worker implements Runnable {
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;
Worker(CountDownLatch startSignal,
CountDownLatch doneSignal) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
public void run() {
try {
startSignal.await();//等待主线程把startSignal计数值减到0(countDown)
doWork();
doneSignal.countDown();//把doneSignal的计数值剪1
} catch (InterruptedException ex) {} //
return;
}
void doWork() { ... }
}
在理解AQS的基础上,分析CountDownLatch是比较简单的,它是基于共享模式的实现。下面是await()方法的实现
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
最终会调用sync的tryAcquireShared方法判断是否可以获得锁,下面的代码说明了state等于0时就可以获得锁,await也就将执行结束,线程就可以往下继续执行了
public int tryAcquireShared(int acquires) {
return getState() == 0? 1 : -1;
}
再看countDown方法,
public void countDown() {
sync.releaseShared(1);
}
最终会通过sync的tryReleaseShared来尝试释放锁,就是通过CAS操作来减少计数
public boolean tryReleaseShared(int releases) {
// Decrement count; signal when transition
to zero
for (;;) {
int c = getState();
if (c == 0)
return false;
int nextc = c-1;
if (compareAndSetState(c, nextc))
return nextc == 0;
}
}
分享到:
相关推荐
狂神说JUC代码
Java 多线程与并发(10_26)-JUC锁_ 锁核心类AQS详解
juc 的aqs介绍。
JUC代码收集,java高并发多线程学习
Java 并发编程中的 JUC(java.util.concurrent)库以及其核心组件 AQS(AbstractQueuedSynchronizer)在构建高性能、可伸缩性的多线程应用方面具有重要的地位。 AQS 是 JUC 中的核心组件,它提供了一个框架,让...
个人学习的时候对JUC做的笔记,包括所有代码,学习视频是尚硅谷周阳老师的JUC,需要有一定的基础才能看懂,这是个人笔记,不一定适用于所有人,谢谢!
JUC是什么 线程 进程 / 线程 线程状态 wait / sleep 并发 / 并行 Lock 使用Lock锁 可重入锁 公平锁 / 非公平锁 Synchronized / Lock 线程通讯 wait()、notify()和notifyAll() 虚假唤醒 Condition 定制化通信 多线程...
为了学习JUC,AQS是基础中的基础,所以我们首先深入了解下AQS。 一、锁的介绍 为了了解AQS的源码,我们需要先大概下锁中的一些功能 1.1 乐观锁/悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同...
JUC代码演示 Java多线程并发 源于B站https://www.bilibili.com/video/BV1Kw411Z7dF/?p=32&spm_id_from=333.1007.top_right_bar_window_history.content.click课程自我项目记录。 适合有一定基础的朋友。
本资源描述了Java并发常见的问题AQS的加锁解锁的过程
juc学习代码。。。。
juc并发编程脑图以及相关示例代码
尚硅谷_JUC线程高级_CountDownLatch 闭锁 ·6. 实现 Callable 接口 ·7. 尚硅谷_JUC线程高级_同步锁 Lock ·8. 尚硅谷_JUC线程高级_生产者消费者案例-虚假唤醒 ·9. 尚硅谷_JUC线程高级_Condition 线程通信 ·10. ...
【尚硅谷】大厂必备技术之JUC并发编程视频 配套资料,自己根据视频整理 pdf 课件,和代码 视频地址:...
ReentrantLock Lock 加锁过程源码分析图,AQS 源码分析
详细阐述了ReentrantLock通过AQS获取锁到释放锁的过程,附有关键方法的源码及注释
用于定义类似于线程的自定义子系统,包括线程池,异步 IO 和轻量级任务框架;包含下载地址
从JUC中的AQS引入,讲解Java volatile与AQS锁内存可见性
主要介绍了java CyclicBarrier的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
juc入门案例演示代码