Skip to main content

Recipe: Shared Reentrant Read Write Lock

Description​

A re-entrant read/write mutex that works across JVMs. Uses Zookeeper to hold the lock. All processes in all JVMs that use the same lock path will achieve an inter-process critical section. Further, this mutex is "fair" - each user will get the mutex in the order requested (from ZK's point of view).

A read write lock maintains a pair of associated locks, one for read-only operations and one for writing. The read lock may be held simultaneously by multiple reader processes, so long as there are no writers. The write lock is exclusive.

Reentrancy​

This lock allows both readers and writers to reacquire read or write locks in the style of a re-entrant lock. Non-re-entrant readers are not allowed until all write locks held by the writing thread/process have been released. Additionally, a writer can acquire the read lock, but not vice-versa. If a reader tries to acquire the write lock it will never succeed.

Lock Downgrading​

Reentrancy also allows downgrading from the write lock to a read lock, by acquiring the write lock, then the read lock and then releasing the write lock. However, upgrading from a read lock to the write lock is not possible.

Participating Classes​

  • InterProcessReadWriteLock
  • InterProcessLock

Create an InterProcessReadWriteLock​

// Parameters:
// client - the client
// basePath - path to use for locking
public InterProcessReadWriteLock(CuratorFramework client, String basePath);

General Usage​

Access either the read lock or the write lock and then use the methods as described for Shared lock.

public InterProcessLock readLock();
public InterProcessLock writeLock();

Error Handling​

It is strongly recommended that you add a ConnectionStateListener and watch for SUSPENDED and LOST state changes. If a SUSPENDED state is reported you cannot be certain that you still hold the lock unless you subsequently receive a RECONNECTED state. If a LOST state is reported it is certain that you no longer hold the lock.