public class LockManager {
private Object semaphore = new Object();
private ConcurrentMap<String, ConcurrentMap<Object, Object>> lockMap = new ConcurrentHashMap<String, ConcurrentMap<Object, Object>>();
private boolean getLock(String lockType, Object key) {
synchronized (this.semaphore) {
ConcurrentMap<Object, Object> map = (ConcurrentMap<Object, Object>) this.lockMap.get(lockType);
if (map == null) {
map = new ConcurrentHashMap<Object, Object>();
this.lockMap.put(lockType, map);
}
return (map.putIfAbsent(key, key) == null);
}
}
public void getLock(String lockType, Object key, long timeout) throws TimeoutException {
Boolean flag = false;
if (timeout <= 0L) {
flag = true;
}
long beginTime = System.currentTimeMillis();
long endTime = beginTime + timeout;
while (!(getLock(lockType, key))) {
try {
Thread.sleep(100L);
} catch (InterruptedException localInterruptedException) {
}
if ( !flag && System.currentTimeMillis() >= endTime)
throw new TimeoutException();
}
}
/**
* 是否指定的锁类型,当前锁的数量为空
* @param lockType
* @return
*/
public boolean isEmptyLock(String lockType){
if (null != this.lockMap.get(lockType)){
return this.lockMap.get(lockType).size() == 0;
} else {
return false;
}
}
public void releaseLock(String lockType, Object key) {
synchronized (this.semaphore) {
ConcurrentMap<Object, Object> map = (ConcurrentMap<Object, Object>) this.lockMap.get(lockType);
if (map != null)
map.remove(key);
}
}
}
private Object semaphore = new Object();
private ConcurrentMap<String, ConcurrentMap<Object, Object>> lockMap = new ConcurrentHashMap<String, ConcurrentMap<Object, Object>>();
private boolean getLock(String lockType, Object key) {
synchronized (this.semaphore) {
ConcurrentMap<Object, Object> map = (ConcurrentMap<Object, Object>) this.lockMap.get(lockType);
if (map == null) {
map = new ConcurrentHashMap<Object, Object>();
this.lockMap.put(lockType, map);
}
return (map.putIfAbsent(key, key) == null);
}
}
public void getLock(String lockType, Object key, long timeout) throws TimeoutException {
Boolean flag = false;
if (timeout <= 0L) {
flag = true;
}
long beginTime = System.currentTimeMillis();
long endTime = beginTime + timeout;
while (!(getLock(lockType, key))) {
try {
Thread.sleep(100L);
} catch (InterruptedException localInterruptedException) {
}
if ( !flag && System.currentTimeMillis() >= endTime)
throw new TimeoutException();
}
}
/**
* 是否指定的锁类型,当前锁的数量为空
* @param lockType
* @return
*/
public boolean isEmptyLock(String lockType){
if (null != this.lockMap.get(lockType)){
return this.lockMap.get(lockType).size() == 0;
} else {
return false;
}
}
public void releaseLock(String lockType, Object key) {
synchronized (this.semaphore) {
ConcurrentMap<Object, Object> map = (ConcurrentMap<Object, Object>) this.lockMap.get(lockType);
if (map != null)
map.remove(key);
}
}
}