一、使用redis实现分布式共享锁
/**
* 使用redis实现分布式共享锁
*/
public String acquireLock(final String key,long timeout){
//设置锁值,当前时间加锁超时时间
String value = String.valueOf(getRedisTime() + timeout);
Random random = new Random();
int i = 0;
// 查询锁是否已经占用
while(!setNxAsString(key,value)){
//若锁已经占用,随机休眠当前线程,防止同时竞争
int randomInt = random.nextInt(1000);
try{
Thread.sleep(randomInt);
}catch (InterruptedException e){
}
// 判断锁是否超时,如超时,重新获取锁并判断锁是否获取成功
if(getRedisTime() > Long.valueOf((String) getValueAsString(key)) && getRedisTime() > Long.valueOf(getSetAsString(key,value))){
return value;
}else if(i < 5){
value = String.valueOf(getRedisTime() + timeout);
i++;
}else{
return null;
}
}
return value;
}
/**
*
* @param key
* @param oldValue 上次获取锁时的值
* @return
*/
public boolean releaseLock(final String key,final String oldValue){
String value = (String) getValueAsString(key);
if(oldValue.equals(value)){
long count = delKey(key);
if(count == 1){
return true;
}
}
return false;
}
----