summaryrefslogtreecommitdiffstats
path: root/vespajlib
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@oath.com>2017-09-25 15:11:26 +0200
committerValerij Fredriksen <valerijf@oath.com>2017-09-25 15:11:26 +0200
commitbfa6f1313c374daa968f2f0b91965dc6ddc74933 (patch)
tree6c86e4d78d28b874fa272673fb6aa10a8cd154c9 /vespajlib
parentbaaf967996c4442c9dd6092e4d969fb27e9e17fb (diff)
Use own monitor
Diffstat (limited to 'vespajlib')
-rw-r--r--vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java48
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();
}
}
}