/**
* ----------------------------------------------------
* 使用AbstractQueuedSynchronizer来实现。
* java.util.concurrent.Semaphore正是使用这种方式
* 可进一步参考系列文章:http://www.infoq.com/cn/articles/jdk1.8-abstractqueuedsynchronizer
* 以及 http://www.infoq.com/cn/minibooks/java_memory_model
* ----------------------------------------------------
*/
class AQSSema implements IMySemaphore {
private final Sync _sync;
AQSSema(final int i) {
_sync = new Sync(i);
}
// 通过一个 volatile state 数据来控制互斥
private static class Sync extends AbstractQueuedSynchronizer {
Sync(int permits) {
setState(permits);
}
/*
* if remaining < 0, this thread should await;
* else, should acquire permits, until remaining < 0
*/
protected int tryAcquireShared(int acquires) {
for (;;) {
int available = getState();
int remaining = available - acquires;
if (remaining < 0 ||
compareAndSetState(available, remaining))
return remaining;
}
}
/*
* because other thread will set state,
* so need spin to insure release success
*/
protected boolean tryReleaseShared(int releases) {
for (;;) {
int p = getState();
if (compareAndSetState(p, p + releases))
return true;
}
}
}
public void acquire() throws InterruptedException {
_sync.acquireSharedInterruptibly(1);
}
public void release() {
_sync.releaseShared(1);
}
}
体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(5)
最新推荐文章于 2024-07-10 21:37:49 发布