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.