diff options
author | Valerij Fredriksen <valerijf@oath.com> | 2017-09-25 13:22:25 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerijf@oath.com> | 2017-09-25 13:22:25 +0200 |
commit | 3061a57e93cc1bd4f6354bdb05335160e1282aa0 (patch) | |
tree | 3d80dab07b2e62b82be11d8f5e7e6240bfe9971f /vespajlib | |
parent | 77dacd5d9c88c7d1b1e2143df84205bbf04bdfd5 (diff) |
Add tryLock()
Diffstat (limited to 'vespajlib')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java | 42 | ||||
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/concurrent/classlock/LockInterruptException.java | 8 |
2 files changed, 31 insertions, 19 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 8014148cc30..61e6850ee2e 100644 --- a/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java +++ b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java @@ -2,36 +2,40 @@ package com.yahoo.concurrent.classlock; import java.util.HashMap; import java.util.Map; +import java.util.function.Supplier; /** * @author valerijf */ public class ClassLocking { private final Map<Class<?>, ClassLock> classLocks = new HashMap<>(); - private final Object monitor = new Object(); - public ClassLock lock(Class<?> clazz) { - synchronized (monitor) { - while(classLocks.containsKey(clazz)) { - try { - monitor.wait(); - } catch (InterruptedException ignored) { } - } + public synchronized ClassLock lock(Class<?> clazz) { + return tryLock(clazz, () -> true); + } - ClassLock classLock = new ClassLock(this, clazz); - classLocks.put(clazz, classLock); - return classLock; + public synchronized ClassLock tryLock(Class<?> clazz, Supplier<Boolean> continueRetrying) { + while(classLocks.containsKey(clazz)) { + try { + wait(); + } catch (InterruptedException ignored) { + if (! continueRetrying.get()) { + throw new LockInterruptException(); + } + } } + + 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"); } } } diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/classlock/LockInterruptException.java b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/LockInterruptException.java new file mode 100644 index 00000000000..b2ae4166564 --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/LockInterruptException.java @@ -0,0 +1,8 @@ +package com.yahoo.concurrent.classlock; + +/** + * @author valerijf + */ +@SuppressWarnings("serial") +public class LockInterruptException extends RuntimeException { +} |