blob: 18691c40819ebef43d008ad17497bc242fb25d13 [file] [log] [blame] [view]
---
sidebar_label: 'Shared Reentrant Read Write Lock'
---
# 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
```java
// 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](recipes-shared-lock.md).
```java
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.