summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src/main/java/bjc/utils/funcutils
diff options
context:
space:
mode:
authorbjculkin <bjculkin@mix.wvu.edu>2017-04-06 15:56:16 -0400
committerbjculkin <bjculkin@mix.wvu.edu>2017-04-06 15:56:16 -0400
commitb14d48413253c78799c170e5d6faf47efde4c256 (patch)
tree489d02c0f2bf626a4a7a2e05b14869781469b36b /BJC-Utils2/src/main/java/bjc/utils/funcutils
parent25382427eeafda30aa06a27f37c65fdaf8b67eba (diff)
Add simple lock w/ lambda capabilities
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc/utils/funcutils')
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/funcutils/LambdaLock.java98
1 files changed, 98 insertions, 0 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/funcutils/LambdaLock.java b/BJC-Utils2/src/main/java/bjc/utils/funcutils/LambdaLock.java
new file mode 100644
index 0000000..a021e83
--- /dev/null
+++ b/BJC-Utils2/src/main/java/bjc/utils/funcutils/LambdaLock.java
@@ -0,0 +1,98 @@
+package bjc.utils.funcutils;
+
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+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 Lock readLock;
+ private Lock writeLock;
+
+ /**
+ * Create a new lambda-enabled lock.
+ *
+ * @param lck
+ * The lock to wrap.
+ */
+ public LambdaLock(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(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(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.
+ *
+ * @return The result of the action.
+ */
+ public void read(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(Runnable action) {
+ writeLock.lock();
+
+ try {
+ action.run();
+ } finally {
+ writeLock.unlock();
+ }
+ }
+} \ No newline at end of file