源码解析
内部锁结构 (共享锁)
/**
* 继承AQS,实现共享锁的获取和释放方法
*/
private static final class Sync extends AbstractQueuedSynchronizer {
Sync(int count) {
setState(count);
}
int getCount() {
return getState();
}
/**
* 状态码为0,则返回1表示获取到锁,否则返回-1,将任务放入同步队列中
*/
protected int tryAcquireShared(int acquires) {
return (getState() == 0) ? 1 : -1;
}
/**
* 释放锁,如果状态码为0,表示没有锁释放,返回false;
* 否则,state-1,并返回锁是否释放完毕。
*/
protected boolean tryReleaseShared(int releases) {
for (;;) {
int c = getState();
if (c == 0)
return false;
int nextc = c-1;
if (compareAndSetState(c, nextc))
return nextc == 0;
}
}
}
初始化
public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException("count < 0");
this.sync = new Sync(count);
}
countDown 方法
- 释放锁,具体调用的方法上面Syn内部静态子类已经分析了的。state -1
public void countDown() {
sync.releaseShared(1);
}
await 方法
- 实指就是获取锁的状态,必须等初始设置的state == 0 ,才能从同步队列中释放执行。
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}