最大允许指定数量的线程并行运作。其他排队等候
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
public class MyLock extends AbstractQueuedSynchronizer {
public MyLock(int count){
setState(count);
}
@Override
protected int tryAcquireShared(int arg) {
for (; ; ) {
int current = getState();
int newCount = current ‐ arg;
if (newCount < 0 || compareAndSetState(current, newCount)) {
return newCount;
}
}
}
@Override
protected boolean tryReleaseShared(int arg) {
for (; ; ) {
int current = getState();
int newState = current + arg;
if (compareAndSetState(current, newState)) {
return true;
}
}
}
public static void main(String[] args) {
final MyLock lock = new MyLock(3);
for (int i = 0; i < 30; i++) {
new Thread(new Runnable() {
public void run() {
lock.acquireShared(1);
try {
Thread.currentThread().sleep(1000);
System.out.println("ok");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.releaseShared(1);
}
}
}).start();
}
}
}
验证结果:虽然30个一次性start,但是会每1s输出3个ok,达到了并发控制