一、使用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;
}

 

 

 

 

----