import java.util.concurrent.locks.*;
/**
* SemaphoreOnLock
* <p/>
* Counting semaphore implemented using Lock
* (Not really how java.util.concurrent.Semaphore is implemented)
*/
public class SemaphoreOnLock {
private final Lock lock = new ReentrantLock();
// CONDITION PREDICATE: permitsAvailable (permits > 0)
private final Condition permitsAvailable = lock.newCondition();
private int permits;
SemaphoreOnLock(int initialPermits) {
lock.lock();
try {
permits = initialPermits;
} finally {
lock.unlock();
}
}
// BLOCKS-UNTIL: permitsAvailable
public void acquire() throws InterruptedException {
lock.lock();
try {
while (permits <= 0)
permitsAvailable.await();
--permits;
} finally {
lock.unlock();
}
}
public void release() {
lock.lock();
try {
++permits;
permitsAvailable.signal();
} finally {
lock.unlock();
}
}
public static void main(String...args) {
SemaphoreOnLock sl = new SemaphoreOnLock(2);
for(int i = 0; i < 10; i++) {
int ii = i;
new Thread(() -> {
try {
sl.acquire();
System.out.println("got it " + ii);
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("about to release " + ii);
sl.release();
}
}).start();
}
}
}
No comments:
Post a Comment