package spimedb.util;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Locker<X> {
public final ConcurrentHashMap<X,DBLock> lock = new ConcurrentHashMap<>();
public Lock get(X id) {
return lock.computeIfAbsent(id, DBLock::new);
}
public final class DBLock extends ReentrantLock {
private final X id;
public DBLock(X id) {
super(true);
this.id = id;
}
//TODO did this need to be synchronized?
@Override public void unlock() {
super.unlock();
lock.computeIfPresent(id,
(k,v) -> (!hasQueuedThreads()) ? null : v);
}
}
}