package tc.oc.commons.core.concurrent;
import java.util.concurrent.locks.Lock;
import javax.annotation.Nullable;
/**
* Usage:
*
* <pre>
* try(Locker locker = Locker.lock(someLock)) {
* ...
* }
*
* try(Locker locker = Locker.lockInterruptibly(someLock)) {
* ...
* } catch(InterruptedException e) {
* ...
* }
*
* try(Locker locker = Locker.tryLock(someLock)) {
* if(locker != null) {
* ...
* }
* }
* </pre>
*/
public class Locker implements AutoCloseable {
private final Lock lock;
private Locker(Lock lock) {
this.lock = lock;
}
@Override
public void close() {
lock.unlock();
}
public static Locker lock(Lock lock) {
lock.lock();
return new Locker(lock);
}
public static Locker lockInterruptibly(Lock lock) throws InterruptedException {
lock.lockInterruptibly();
return new Locker(lock);
}
public static @Nullable Locker tryLock(Lock lock) {
return lock.tryLock() ? new Locker(lock) : null;
}
}