public class LockingVisitors extends Object
Locks as an alternative to synchronization.
Locking may be preferable to synchronization or when an application needs 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).
For example, to use this class with a ReentrantLock:
reentrantLockVisitor(Object), passing the object to protect. This creates a
LockingVisitors.ReentrantLockVisitor
FailableConsumer lambda. The consumer will receive the object as a parameter while the visitor holds the
lock. Then call
LockingVisitors.LockVisitor.acceptReadLocked(FailableConsumer), or
LockingVisitors.LockVisitor.acceptWriteLocked(FailableConsumer), passing the consumer.
FailableFunction lambda. To have the function executed, call
LockingVisitors.LockVisitor.applyReadLocked(FailableFunction), or
LockingVisitors.LockVisitor.applyWriteLocked(FailableFunction).
Example 1: A thread safe logger class using a LockingVisitors.ReentrantLockVisitor.
public class SimpleLogger1 {
private final ReentrantLockVisitor<PrintStream> lock;
private final PrintStream ps;
public SimpleLogger(OutputStream out) {
ps = new PrintStream(out);
lock = LockingVisitors.reentrantLockVisitor(ps);
}
public void log(String message) {
lock.acceptWriteLocked(ps -> ps.println(message));
}
public void log(byte[] buffer) {
lock.acceptWriteLocked(ps -> { ps.write(buffer); ps.println(); });
}
}
Example 2: A thread safe logger class using a LockingVisitors.ReadWriteLockVisitor.
public class SimpleLogger2 {
private final ReadWriteLockVisitor<PrintStream> lock;
private final PrintStream ps;
public SimpleLogger(OutputStream out) {
ps = new PrintStream(out);
lock = LockingVisitors.readWriteLockVisitor(ps);
}
public void log(String message) {
lock.acceptWriteLocked(ps -> ps.println(message));
}
public void log(byte[] buffer) {
lock.acceptWriteLocked(ps -> { ps.write(buffer); ps.println(); });
}
}
Example 3: A thread safe logger class using a StampedLock.
public class SimpleLogger3 {
private final StampedLockVisitor<PrintStream> lock;
private final PrintStream ps;
public SimpleLogger(OutputStream out) {
ps = new PrintStream(out);
lock = LockingVisitors.stampedLockVisitor(ps);
}
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>
Wraps a
ReadWriteLock and object to protect. |
static class |
LockingVisitors.ReentrantLockVisitor<O>
Wraps a
ReentrantLock and object to protect. |
static class |
LockingVisitors.StampedLockVisitor<O>
Wraps a
StampedLock and object to protect. |
| Constructor and Description |
|---|
LockingVisitors()
Deprecated.
TODO Make private in 4.0.
|
| Modifier and Type | Method and Description |
|---|---|
static <O> LockingVisitors.ReadWriteLockVisitor<O> |
create(O object,
ReadWriteLock readWriteLock)
Creates a new instance of
LockingVisitors.ReadWriteLockVisitor with the given object and lock. |
static <O> LockingVisitors.ReentrantLockVisitor<O> |
create(O object,
ReentrantLock reentrantLock)
Creates a new instance of
LockingVisitors.ReentrantLockVisitor with the given object and lock. |
static <O> LockingVisitors.ReentrantLockVisitor<O> |
reentrantLockVisitor(O object)
Creates a new instance of
LockingVisitors.ReentrantLockVisitor with the given object. |
static <O> LockingVisitors.ReadWriteLockVisitor<O> |
reentrantReadWriteLockVisitor(O object)
Creates a new instance of
LockingVisitors.ReadWriteLockVisitor with the given object. |
static <O> LockingVisitors.StampedLockVisitor<O> |
stampedLockVisitor(O object)
Creates a new instance of
LockingVisitors.StampedLockVisitor with the given object. |
@Deprecated public LockingVisitors()
LockingVisitorspublic static <O> LockingVisitors.ReadWriteLockVisitor<O> create(O object, ReadWriteLock readWriteLock)
LockingVisitors.ReadWriteLockVisitor with the given object and lock.O - The type of the object to protect.object - The object to protect.readWriteLock - The lock to use.LockingVisitors.ReadWriteLockVisitor.LockingVisitorspublic static <O> LockingVisitors.ReentrantLockVisitor<O> create(O object, ReentrantLock reentrantLock)
LockingVisitors.ReentrantLockVisitor with the given object and lock.O - The type of the object to protect.object - The object to protect.reentrantLock - The lock to use.LockingVisitors.ReentrantLockVisitor.LockingVisitorspublic static <O> LockingVisitors.ReentrantLockVisitor<O> reentrantLockVisitor(O object)
LockingVisitors.ReentrantLockVisitor with the given object.O - The type of the object to protect.object - The object to protect.LockingVisitors.ReentrantLockVisitor.LockingVisitorspublic static <O> LockingVisitors.ReadWriteLockVisitor<O> reentrantReadWriteLockVisitor(O object)
LockingVisitors.ReadWriteLockVisitor with the given object.O - The type of the object to protect.object - The object to protect.LockingVisitors.ReadWriteLockVisitor.LockingVisitorspublic static <O> LockingVisitors.StampedLockVisitor<O> stampedLockVisitor(O object)
LockingVisitors.StampedLockVisitor with the given object.O - The type of the object to protect.object - The object to protect.LockingVisitors.StampedLockVisitor.LockingVisitorsCopyright © 2001–2025 The Apache Software Foundation. All rights reserved.