42 lines
918 B
Java
42 lines
918 B
Java
package org.warp.commonutils.locks;
|
|
|
|
import java.util.concurrent.Semaphore;
|
|
|
|
public class TransitLock {
|
|
|
|
private final FlexibleCountDownLatch unfinishedTransits = new FlexibleCountDownLatch(0);
|
|
private final Semaphore permits = new Semaphore(Integer.MAX_VALUE);
|
|
private final Object synchronization = new Object();
|
|
|
|
public TransitLock() {
|
|
}
|
|
|
|
public void allowTransit() {
|
|
var permitsToRelease = Math.max(0, Integer.MAX_VALUE - (permits.availablePermits() + 10000));
|
|
permits.release(permitsToRelease);
|
|
}
|
|
|
|
public void disallowTransit() {
|
|
synchronized (synchronization) {
|
|
unfinishedTransits.await();
|
|
permits.drainPermits();
|
|
}
|
|
}
|
|
|
|
public void transit() {
|
|
startTransit();
|
|
endTransit();
|
|
}
|
|
|
|
public void startTransit() {
|
|
synchronized (synchronization) {
|
|
unfinishedTransits.grow();
|
|
permits.acquireUninterruptibly();
|
|
}
|
|
}
|
|
|
|
public void endTransit() {
|
|
unfinishedTransits.countDown();
|
|
}
|
|
}
|