diff options
Diffstat (limited to 'vespajlib/src/main/java/com/yahoo/concurrent')
3 files changed, 61 insertions, 0 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLock.java b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLock.java new file mode 100644 index 00000000000..2a3c70d31d2 --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLock.java @@ -0,0 +1,19 @@ +package com.yahoo.concurrent.classlock; + +/** + * @author valerijf + */ +public class ClassLock implements AutoCloseable { + private final Class<?> clazz; + private final ClassLocking classLocking; + + ClassLock(ClassLocking classLocking, Class<?> clazz) { + this.classLocking = classLocking; + this.clazz = clazz; + } + + @Override + public void close() { + classLocking.unlock(clazz, this); + } +} diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java new file mode 100644 index 00000000000..8014148cc30 --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java @@ -0,0 +1,37 @@ +package com.yahoo.concurrent.classlock; + +import java.util.HashMap; +import java.util.Map; + +/** + * @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) { } + } + + 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"); + } + } + } +} diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/classlock/package-info.java b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/package-info.java new file mode 100644 index 00000000000..010af471f03 --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/package-info.java @@ -0,0 +1,5 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +@ExportPackage +package com.yahoo.concurrent.classlock; + +import com.yahoo.osgi.annotation.ExportPackage; |