| 1 | package com.hammurapi.store; |
| 2 | |
| 3 | import java.util.concurrent.locks.Lock; |
| 4 | import java.util.concurrent.locks.ReadWriteLock; |
| 5 | |
| 6 | /** |
| 7 | * This lock acts on behalf of another lock and acquires its own locks |
| 8 | * only if the master doesn't hold corresponding locks. This class is used |
| 9 | * to distribute store operations to multiple threads/processes. |
| 10 | * @author Pavel Vlasov |
| 11 | * |
| 12 | */ |
| 13 | public class DeputyReadWriteLock implements ReadWriteLock { |
| 14 | |
| 15 | private DeputyLock readLock; |
| 16 | private DeputyLock writeLock; |
| 17 | |
| 18 | public DeputyReadWriteLock(ReadWriteLock master, boolean readLocked, boolean writeLocked) { |
| 19 | this.readLock = new DeputyLock(master.readLock(), readLocked || writeLocked, false, null); |
| 20 | this.writeLock = new DeputyLock(master.writeLock(), writeLocked, !writeLocked && readLocked, "Read lock is already held, can't upgrade to write lock, locks can only be downgraded."); |
| 21 | } |
| 22 | |
| 23 | protected DeputyReadWriteLock(DeputyLock readLock, DeputyLock writeLock) { |
| 24 | this.readLock = readLock; |
| 25 | this.writeLock = writeLock; |
| 26 | } |
| 27 | |
| 28 | @Override |
| 29 | public Lock readLock() { |
| 30 | return readLock; |
| 31 | } |
| 32 | |
| 33 | @Override |
| 34 | public Lock writeLock() { |
| 35 | return writeLock; |
| 36 | } |
| 37 | |
| 38 | public DeputyReadWriteLock createDeputy() { |
| 39 | return new DeputyReadWriteLock(this, readLock.isLocked() || writeLock.isLocked(), writeLock.isLocked()); |
| 40 | } |
| 41 | |
| 42 | } |