On this page

LockingVisitors

public class org.apache.commons.lang3.concurrent.locks.LockingVisitors[source]

Combines the monitor and visitor pattern to work with Locks as an alternative to synchronization.

The read and write methods use the locks supplied by the visitor. A ReentrantLockVisitor uses one exclusive lock for both methods. A ReadWriteLockVisitor uses the underlying read and write locks, while a StampedLockVisitor uses its read and write Lock views. Read operations may run concurrently only when the supplied lock supports shared reads.

For example, to use this class with a ReentrantLock:

  1. In single threaded mode, call #reentrantLockVisitor(Object), passing the object to protect. This creates a LockingVisitors.ReentrantLockVisitor

  2. To access the protected object, create a 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.

  3. Alternatively, to receive a result object, use a 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(); });
    }
}
Since:

3.11

Constructors

LockingVisitors()

Deprecated. Make private in 4.0.

@Deprecated public LockingVisitors()[source]

Deprecated: TODO Make private in 4.0.

Make private in 4.0.

See also:

LockingVisitors

Methods

create(Object, ReadWriteLock)

Creates a new instance of ReadWriteLockVisitor with the given object and lock.

create(Object, ReentrantLock)

Creates a new instance of ReentrantLockVisitor with the given object and lock.

reentrantLockVisitor(Object)

Creates a new instance of ReentrantLockVisitor with the given object.

reentrantReadWriteLockVisitor(Object)

Creates a new instance of ReadWriteLockVisitor with the given object.

stampedLockVisitor(Object)

Creates a new instance of StampedLockVisitor with the given object.

public static <O> LockingVisitors.ReadWriteLockVisitor<O> create(O object, ReadWriteLock readWriteLock)[source]

Creates a new instance of ReadWriteLockVisitor with the given object and lock.

Type parameters:

<O> – The type of the object to protect.

Parameters:
  • object – The object to protect.

  • readWriteLock – The lock to use.

Returns:

A new ReadWriteLockVisitor.

See also:

LockingVisitors

Since:

3.13.0

public static <O> LockingVisitors.ReentrantLockVisitor<O> create(O object, ReentrantLock reentrantLock)[source]

Creates a new instance of ReentrantLockVisitor with the given object and lock.

Type parameters:

<O> – The type of the object to protect.

Parameters:
  • object – The object to protect.

  • reentrantLock – The lock to use.

Returns:

A new ReentrantLockVisitor.

See also:

LockingVisitors

Since:

3.18.0

public static <O> LockingVisitors.ReentrantLockVisitor<O> reentrantLockVisitor(O object)[source]

Creates a new instance of ReentrantLockVisitor with the given object.

Type parameters:

<O> – The type of the object to protect.

Parameters:

object – The object to protect.

Returns:

A new ReentrantLockVisitor.

See also:

LockingVisitors

Since:

3.18.0

public static <O> LockingVisitors.ReadWriteLockVisitor<O> reentrantReadWriteLockVisitor(O object)[source]

Creates a new instance of ReadWriteLockVisitor with the given object.

Type parameters:

<O> – The type of the object to protect.

Parameters:

object – The object to protect.

Returns:

A new ReadWriteLockVisitor.

See also:

LockingVisitors

public static <O> LockingVisitors.StampedLockVisitor<O> stampedLockVisitor(O object)[source]

Creates a new instance of StampedLockVisitor with the given object.

Type parameters:

<O> – The type of the object to protect.

Parameters:

object – The object to protect.

Returns:

A new StampedLockVisitor.

See also:

LockingVisitors