通过 AbstractQueuedSynchronizer 实现最简单的 Semaphore
继承 AbstractQueuedSynchronizer,
重写 tryAcquireShared 和 tryReleaseShared 两个方法。
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
public class SemaphoreTest {
static class Semaphore extends AbstractQueuedSynchronizer {
public Semaphore(int permits) {
setState(permits);
}
@Override
protected int tryAcquireShared(int arg) {
int available = getState();
if (available == 0) {
return -1;
}
int left = available - 1;
if (compareAndSetState(available, left)) {
return left;
}
return -1;
}
@Override
protected boolean tryReleaseShared(int arg) {
int available = getState();
return compareAndSetState(available, available + 1);
}
}
public static void main(String[] args) {
var semaphore = new Semaphore(3);
for (int i = 0; i < 1000; i++) {
new Thread(() -> {
semaphore.acquireShared(0);
try {
System.out.println("go");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
semaphore.releaseShared(0);
}).start();
}
}
}