summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/funcutils/LambdaLock.java
diff options
context:
space:
mode:
Diffstat (limited to 'base/src/main/java/bjc/utils/funcutils/LambdaLock.java')
-rw-r--r--base/src/main/java/bjc/utils/funcutils/LambdaLock.java105
1 files changed, 105 insertions, 0 deletions
diff --git a/base/src/main/java/bjc/utils/funcutils/LambdaLock.java b/base/src/main/java/bjc/utils/funcutils/LambdaLock.java
new file mode 100644
index 0000000..62c5d32
--- /dev/null
+++ b/base/src/main/java/bjc/utils/funcutils/LambdaLock.java
@@ -0,0 +1,105 @@
+package bjc.utils.funcutils;
+
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.function.Supplier;
+
+/**
+ * A wrapper around a {@link ReadWriteLock} to ensure that the lock is used
+ * properly.
+ *
+ * @author EVE
+ *
+ */
+public class LambdaLock {
+ private final Lock readLock;
+ private final Lock writeLock;
+
+ /**
+ * Create a new lambda-enabled lock around a new lock.
+ */
+ public LambdaLock() {
+ this(new ReentrantReadWriteLock());
+ }
+
+ /**
+ * Create a new lambda-enabled lock.
+ *
+ * @param lck
+ * The lock to wrap.
+ */
+ public LambdaLock(final ReadWriteLock lck) {
+ readLock = lck.readLock();
+ writeLock = lck.writeLock();
+ }
+
+ /**
+ * Execute an action with the read lock taken.
+ *
+ * @param supp
+ * The action to call.
+ *
+ * @return The result of the action.
+ */
+ public <T> T read(final Supplier<T> supp) {
+ readLock.lock();
+
+ try {
+ return supp.get();
+ } finally {
+ readLock.unlock();
+ }
+ }
+
+ /**
+ * Execute an action with the write lock taken.
+ *
+ * @param supp
+ * The action to call.
+ *
+ * @return The result of the action.
+ */
+ public <T> T write(final Supplier<T> supp) {
+ writeLock.lock();
+
+ try {
+ return supp.get();
+ } finally {
+ writeLock.unlock();
+ }
+ }
+
+ /**
+ * Execute an action with the read lock taken.
+ *
+ * @param action
+ * The action to call.
+ *
+ */
+ public void read(final Runnable action) {
+ readLock.lock();
+
+ try {
+ action.run();
+ } finally {
+ readLock.unlock();
+ }
+ }
+
+ /**
+ * Execute an action with the write lock taken.
+ *
+ * @param action
+ * The action to call.
+ */
+ public void write(final Runnable action) {
+ writeLock.lock();
+
+ try {
+ action.run();
+ } finally {
+ writeLock.unlock();
+ }
+ }
+} \ No newline at end of file