diff options
author | Valerij Fredriksen <valerijf@oath.com> | 2017-09-25 09:22:42 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerijf@oath.com> | 2017-09-25 09:22:42 +0200 |
commit | 251c995c48b55021613865297b6c355456863a07 (patch) | |
tree | 16e76f9fb307ef423b0ad789619be92a7a44f90c /vespajlib | |
parent | a8d6f5c76bb7e9b18bcc16f6dd8f4e9b09d2ba4f (diff) |
Create ClassLocking
Diffstat (limited to 'vespajlib')
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; |