diff options
Diffstat (limited to 'vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java index a6347d9fb14..d8811f4bff2 100644 --- a/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java +++ b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java @@ -9,33 +9,45 @@ import java.util.function.BooleanSupplier; */ public class ClassLocking { private final Map<Class<?>, ClassLock> classLocks = new HashMap<>(); + private final Object monitor = new Object(); - public synchronized ClassLock lock(Class<?> clazz) { + public ClassLock lock(Class<?> clazz) { return lockWhile(clazz, () -> true); } - public synchronized ClassLock lockWhile(Class<?> clazz, BooleanSupplier interruptCondition) { - while(classLocks.containsKey(clazz)) { - try { - wait(); - } catch (InterruptedException ignored) { } - } + public ClassLock lockWhile(Class<?> clazz, BooleanSupplier interruptCondition) { + synchronized (monitor) { + while (classLocks.containsKey(clazz)) { + try { + monitor.wait(); + } catch (InterruptedException ignored) { + } + } + + if (!interruptCondition.getAsBoolean()) { + throw new LockInterruptException(); + } - if (! interruptCondition.getAsBoolean()) { - throw new LockInterruptException(); + ClassLock classLock = new ClassLock(this, clazz); + classLocks.put(clazz, classLock); + return classLock; } + } - ClassLock classLock = new ClassLock(this, clazz); - classLocks.put(clazz, classLock); - return classLock; + void unlock(Class<?> clazz, ClassLock classLock) { + synchronized (monitor) { + if (classLock.equals(classLocks.get(clazz))) { + classLocks.remove(clazz); + monitor.notifyAll(); + } else { + throw new IllegalArgumentException("Lock has already been released"); + } + } } - synchronized void unlock(Class<?> clazz, ClassLock classLock) { - if (classLock.equals(classLocks.get(clazz))) { - classLocks.remove(clazz); - notifyAll(); - } else { - throw new IllegalArgumentException("Lock has already been released"); + public void interrupt() { + synchronized (monitor) { + monitor.notifyAll(); } } } |