/**
* ----------------------------------------------------
* 使用AtomicInteger实现
* 实际上Atomic类比volatile更进一步提供了++等原子操作和CAS(乐观锁)操作
* ----------------------------------------------------
*/
class AtomicSema implements IMySemaphore {
private AtomicInteger _iSignal;
private final int _iPermits;
AtomicSema(final int i) {
_iSignal = new AtomicInteger(0);
_iPermits = i;
}
public void acquire() throws InterruptedException {
int i, update;
while (true) {
// 轮询直到满足要求
i = _iSignal.get();
if (i >= _iPermits) {
try {
Thread.currentThread().sleep(0);
} catch (InterruptedException ie) {
Thread.interrupted();
throw ie;
}
continue;
}
// 通过 CAS 操作确保申请成功
update = i + 1;
if (_iSignal.compareAndSet(i, update)) {
break;
}
}
}
public void release() {
_iSignal.decrementAndGet();
}
}
体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(4)
最新推荐文章于 2024-07-03 19:13:37 发布