001
014
015 package com.liferay.portal.kernel.concurrent;
016
017 import java.util.concurrent.ConcurrentHashMap;
018 import java.util.concurrent.ConcurrentMap;
019 import java.util.concurrent.locks.Lock;
020 import java.util.concurrent.locks.ReadWriteLock;
021 import java.util.concurrent.locks.ReentrantReadWriteLock;
022
023
035 public class ReadWriteLockRegistry {
036
037 public Lock acquireLock(ReadWriteLockKey<?> readWriteLockKey) {
038 ReadWriteLock readWriteLock = _readWriteLockMap.get(readWriteLockKey);
039
040 if (readWriteLock == null) {
041 ReadWriteLock newReadWriteLock = new ReentrantReadWriteLock();
042
043 readWriteLock = _readWriteLockMap.putIfAbsent(
044 readWriteLockKey, newReadWriteLock);
045
046 if (readWriteLock == null) {
047 readWriteLock = newReadWriteLock;
048 }
049 }
050
051 if (readWriteLockKey.isWriteLock()) {
052 return readWriteLock.writeLock();
053 }
054 else {
055 return readWriteLock.readLock();
056 }
057 }
058
059 public void releaseLock(ReadWriteLockKey<?> readWriteLockKey) {
060 if (readWriteLockKey.isWriteLock()) {
061 _readWriteLockMap.remove(readWriteLockKey);
062 }
063 }
064
065 private ConcurrentMap<ReadWriteLockKey<?>, ReadWriteLock>
066 _readWriteLockMap = new ConcurrentHashMap
067 <ReadWriteLockKey<?>, ReadWriteLock>();
068
069 }