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 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 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 |
|---|---|
| public static class | LockingVisitors.
the wrapped object type. O, the wrapped lock type. L>Wraps a domain object and a lock for access by lambdas. |
| public static class | LockingVisitors.
The type of the object to protect. O>Wraps a |
| public static class | LockingVisitors.
The type of the object to protect. O>Wraps a |
| public static class | LockingVisitors.
The type of the object to protect. O>Wraps a |
| Access | Constructor and Description |
|---|---|
| public |
| Modifier and Type | Method and Description |
|---|---|
| public static < The type of the object to protect. O> LockingVisitors. | Returns: A newReadWriteLockVisitor.The object to protect. object, final ReadWriteLock The lock to use. readWriteLock)Creates a new instance of |
| public static < The type of the object to protect. O> LockingVisitors. | Returns: A newReentrantLockVisitor.The object to protect. object, final ReentrantLock The lock to use. reentrantLock)Creates a new instance of |
| public static < The type of the object to protect. O> LockingVisitors. | Returns: A newReentrantLockVisitor.The object to protect. object)Creates a new instance of |
| public static < The type of the object to protect. O> LockingVisitors. | Returns: A newReadWriteLockVisitor.The object to protect. object)Creates a new instance of |
| public static < The type of the object to protect. O> LockingVisitors. | Returns: A newStampedLockVisitor.The object to protect. object)Creates a new instance of |