1
14
15 package com.liferay.portal.kernel.concurrent;
16
17 import java.util.concurrent.ConcurrentHashMap;
18 import java.util.concurrent.ConcurrentMap;
19 import java.util.concurrent.locks.Lock;
20 import java.util.concurrent.locks.ReadWriteLock;
21 import java.util.concurrent.locks.ReentrantReadWriteLock;
22
23
36 public class ReadWriteLockRegistry {
37
38 public Lock acquireLock(ReadWriteLockKey<?> readWriteLockKey) {
39 ReadWriteLock readWriteLock = _readWriteLockMap.get(readWriteLockKey);
40
41 if (readWriteLock == null) {
42 ReadWriteLock newReadWriteLock = new ReentrantReadWriteLock();
43
44 readWriteLock = _readWriteLockMap.putIfAbsent(
45 readWriteLockKey, newReadWriteLock);
46
47 if (readWriteLock == null) {
48 readWriteLock = newReadWriteLock;
49 }
50 }
51
52 if (readWriteLockKey.isWriteLock()) {
53 return readWriteLock.writeLock();
54 }
55 else {
56 return readWriteLock.readLock();
57 }
58 }
59
60 public void releaseLock(ReadWriteLockKey<?> readWriteLockKey) {
61 if (readWriteLockKey.isWriteLock()) {
62 _readWriteLockMap.remove(readWriteLockKey);
63 }
64 }
65
66 private ConcurrentMap<ReadWriteLockKey<?>, ReadWriteLock>
67 _readWriteLockMap = new ConcurrentHashMap
68 <ReadWriteLockKey<?>, ReadWriteLock>();
69
70 }