1、利用AQS进行实现的同步器,实现限制只有N个线程可以同时执行
abstract static class Sync extends AbstractQueuedSynchronizer {
//限制同时只有N个线程可以同时获取到锁进行执行
Sync(int permits) {
setState(permits);
}
final int getPermits() {
return getState();
}
//实现了AQS的获取共享锁
final int nonfairTryAcquireShared(int acquires) {
//自旋等待
for (;;) {
//获取有效的同步状态
int available = getState();
//剩余有效状态
int remaining = available - acquires;
if (remaining < 0 ||
compareAndSetState(available, remaining))
return remaining;
}
}
//实现了AQS释放共享锁
protected final boolean tryReleaseShared(int releases) {
for (;;) {
//获取有效的同步状态
int current = getState();
//下一个状态
int next = current + releases;
if (next < current) // overflow
throw new Error("Maximum permit count exceeded");
//不断对state减少
if (compareAndSetState(current, next))
return true;
}
}
}
2、利用acquire进行阻塞
public void acquire() throws InterruptedException {
//通过AQS的定义,调用子类的实现方法tryAcquireShared 同 nonfairTryAcquireShared,自旋阻塞,直到state小于0
sync.acquireSharedInterruptibly(1);
}
3、利用release进行释放共享锁
public void release() {
//通过AQS的定义,调用子类的实现方法tryReleaseShared,来进行state减1
sync.releaseShared(1);
}