public class LockingVisitors extends Object
Combines the monitor and visitor pattern to work with locked objects
. Locked
objects are an alternative to synchronization. This, on Wikipedia, is known as the Visitor pattern
(https://en.wikipedia.org/wiki/Visitor_pattern), and from the "Gang of Four" "Design Patterns" book's Visitor pattern
[Gamma, E., Helm, R., & Johnson, R. (1998). Visitor. In Design patterns elements of reusable object oriented software (pp. 331-344). Reading: Addison Wesley.].
Locking is preferable, if there is a distinction between read access (multiple threads may have read access concurrently), and write access (only one thread may have write access at any given time). In comparison, synchronization doesn't support read access, because synchronized access is exclusive.
Using this class is fairly straightforward:
LockingVisitors.StampedLockVisitor
by calling
stampedLockVisitor(Object)
, passing the object which needs to be locked. Discard all references to the
locked object. Instead, use references to the lock.FailableConsumer
. The consumer will receive the locked
object as a parameter. For convenience, the consumer may be implemented as a Lambda. Then invoke
LockingVisitors.LockVisitor.acceptReadLocked(FailableConsumer)
, or
LockingVisitors.LockVisitor.acceptWriteLocked(FailableConsumer)
, passing the consumer.FailableFunction
. This function
may also be implemented as a Lambda. To have the function executed, invoke
LockingVisitors.LockVisitor.applyReadLocked(FailableFunction)
, or
LockingVisitors.LockVisitor.applyWriteLocked(FailableFunction)
.Example: A thread safe logger class.
public class SimpleLogger { private final StampedLockVisitor<PrintStream> lock; public SimpleLogger(OutputStream out) { lock = LockingVisitors.stampedLockVisitor(new PrintStream(out)); } public void log(String message) { lock.acceptWriteLocked((ps) -> ps.println(message)); } public void log(byte[] buffer) { lock.acceptWriteLocked((ps) -> { ps.write(buffer); ps.println(); }); }
Modifier and Type | Class and Description |
---|---|
static class |
LockingVisitors.LockVisitor<O,L>
Wraps a domain object and a lock for access by lambdas.
|
static class |
LockingVisitors.ReadWriteLockVisitor<O>
This class implements a wrapper for a locked (hidden) object, and provides the means to access it.
|
static class |
LockingVisitors.StampedLockVisitor<O>
This class implements a wrapper for a locked (hidden) object, and provides the means to access it.
|
Constructor and Description |
---|
LockingVisitors() |
Modifier and Type | Method and Description |
---|---|
static <O> LockingVisitors.ReadWriteLockVisitor<O> |
reentrantReadWriteLockVisitor(O object)
Creates a new instance of
LockingVisitors.ReadWriteLockVisitor with the given (hidden) object. |
static <O> LockingVisitors.StampedLockVisitor<O> |
stampedLockVisitor(O object)
Creates a new instance of
LockingVisitors.StampedLockVisitor with the given (hidden) object. |
public static <O> LockingVisitors.ReadWriteLockVisitor<O> reentrantReadWriteLockVisitor(O object)
LockingVisitors.ReadWriteLockVisitor
with the given (hidden) object.O
- The locked objects type.object
- The locked (hidden) object.lock
for the given object.public static <O> LockingVisitors.StampedLockVisitor<O> stampedLockVisitor(O object)
LockingVisitors.StampedLockVisitor
with the given (hidden) object.O
- The locked objects type.object
- The locked (hidden) object.lock
for the given object.Copyright © 2001–2021 The Apache Software Foundation. All rights reserved.