juc-countdownlatch
2019-08-21 08:50:38 35 举报
CountDownLatch是Java并发编程中的一个同步辅助类,它允许一个或多个线程等待其他线程完成操作。这个类的主要方法是await()和countDown()。当调用await()方法时,当前线程会阻塞,直到计数器减为0。每当一个线程完成其任务并调用countDown()方法时,计数器就会减1。当计数器达到0时,所有等待的线程将被唤醒。CountDownLatch通常用于确保所有线程都准备好执行某个操作,或者确保所有线程都完成了某个操作。这个类在多线程编程中非常有用,可以帮助我们更好地协调和管理线程之间的同步。
作者其他创作
大纲/内容
是
state!=0返回-10尝试阻塞
唤醒
new CountDownLatch(n)
parkAndCheckInterruptLockSupport.park
CountDownLatch#await()
unpark
循环判断继续阻塞还是唤醒
否
doReleaseShared
tryAcquireShared
使条件成立
AQS#releaseShared(1)
不是head下一节点继续阻塞
Sync#tryReleaseShared
state=0返回10
AQS#state=n
0unpark
addWaiter(SHARED)共享
CountDownLatch#countDown()
是否park
countdownlatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行。从命名可以解读到countdown是倒数的意思,类似于我们倒计时的概念。countdownlatch提供了两个方法,一个是countDown,一个是await, countdownlatch初始化的时候需要传入一个整数,在这个整数倒数到0之前,调用了await方法的程序都必须要等待,然后通过countDown来倒数。
<0 继续阻塞
state==0
compareAndSetState
组装node至链尾
1.第一次组装node时,waitStatus=0默认。当判断是否挂起时用cas->waitStatus=-12再次自旋进来时就通过了park的条件 此时主线程进入waiting状态。等待唤醒
AQS#doAcquireSharedInterruptibly(1)
自旋中
setHead
waitStatus=Node.SIGNAL
是否unpark
shouldParkAfterFailedAcquire
await不用阻塞,继续执行
setHeadAndPropagate
AQS#acquireSharedInterruptibly(1)
Sync#tryAcquireShared(getState() == 0) ? 1 : -1
AQS#setState(n)
getState()--
Sync(n)
node.prev==head
0 条评论
下一页