juc-countdownlatch-semaphore-cyclicbarrier
2019-08-21 08:51:48 53 举报
juc-countdownlatch-semaphore-cyclicbarrier
作者其他创作
大纲/内容
执行任务Runnable.run。
唤醒一个节点头节点获得锁
release(int i)
addWaiter
没有直接利用AQS,内部使用的是ReentrantLock lcokCondition trip
nextGeneration
await
AQS
doAcquireSharedInterruptibly(1)
判断state是否为0,等于0则继续执行-已获得锁。不等于0再次尝试获取锁,失败就挂起。
如果当前节点获得锁
CountDownLatch
唤醒所有继续下一个栅栏
doReleaseShared
初始化的时候,把aqs的state设置成N;公平和非公平的初始化
trip.await()/trip.awaitNanos(nanos)
setHeadAndPropagate
releaseShared(1)
state==0
释放资源。判断head节点的状态,-1表示需要唤醒head.next节点,并把状态CAS成0。0表示继续向下传播
Node.SHARED
countDown
继续唤醒下一个节点
await()
初始化的时候,把aqs的state设置成N;
带超时时间的等待。有返回值,true获得锁,false超时
CyclicBarrier
acquire(int i)
acquireSharedInterruptibly(1)
1.当前线程组装成Node加入队列2.判断当前节点是否是head.next,是则再尝试获取锁。不是就park挂起
对state执行加i操作
Semaphore
AQS#setState;state = N
执行任务总数大于N时1.当前线程组装成Node加入队列2.判断当前节点是否是head.next,是则再尝试获取锁。不是就park挂起
对state--操作,一直减到0才向下执行
new(N)
dowait用lock保证安全
state!=0
acquireUninterruptibly
直接执行
await(timeout,timeunit)
0 条评论
下一页