summaryrefslogtreecommitdiffstats
path: root/vespajlib
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@oath.com>2017-09-25 13:22:25 +0200
committerValerij Fredriksen <valerijf@oath.com>2017-09-25 13:22:25 +0200
commit3061a57e93cc1bd4f6354bdb05335160e1282aa0 (patch)
tree3d80dab07b2e62b82be11d8f5e7e6240bfe9971f /vespajlib
parent77dacd5d9c88c7d1b1e2143df84205bbf04bdfd5 (diff)
Add tryLock()
Diffstat (limited to 'vespajlib')
-rw-r--r--vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java42
-rw-r--r--vespajlib/src/main/java/com/yahoo/concurrent/classlock/LockInterruptException.java8
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 {
+}