From b14d48413253c78799c170e5d6faf47efde4c256 Mon Sep 17 00:00:00 2001 From: bjculkin Date: Thu, 6 Apr 2017 15:56:16 -0400 Subject: Add simple lock w/ lambda capabilities --- .../main/java/bjc/utils/funcutils/LambdaLock.java | 98 ++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 BJC-Utils2/src/main/java/bjc/utils/funcutils/LambdaLock.java (limited to 'BJC-Utils2/src/main/java/bjc/utils/funcutils') 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 read(Supplier 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 write(Supplier 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 -- cgit v1.2.3