common-utils/src/main/java/org/warp/commonutils/locks/TransitLock.java

42 lines
918 B
Java
Raw Normal View History

2021-01-22 03:15:14 +01:00
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();
}
}