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 | } |