/**
* ----------------------------------------------------
* 使用原始的synchronized关键字来实现
* 一般来说,这种方式比较可靠,也很好理解。
* 使用这个关键字,可以隐式的进入和退出同步块,不会忘记退出。
* ----------------------------------------------------
*/
class SyncSema implements IMySemaphore {
private int _iSignal;
private final int _iPermits;
SyncSema(final int i) {
_iSignal = 0;
_iPermits = i;
}
public synchronized void acquire() throws InterruptedException {
while (_iSignal >= _iPermits) {
System.out.println("---------- FULL -----------");
try {
wait();
} catch (InterruptedException ie) {
Thread.interrupted();
throw ie;
}
}
_iSignal++;
return;
}
public synchronized void release() {
if (_iSignal > 0) {
_iSignal--;
}
notify();
}
}