import org.apache.log4j.Logger;
import com.sf.weplay.redis.RedisManager;
public class Lock {
//默认最长锁5分钟
private final static int EXPIRED_TIME = 300000;
public static Logger logger = Logger.getLogger(Lock.class);
/**
* 锁
* @param lockName
* @return true 成功/false 失败
*/
public static boolean lock(String lockName) {
return getLock(lockName, 0);
}
/**
* 解除锁
* @param lockName
* @return
*/
public static void unlock(String lockName) {
RedisManager.redisManager.del(lockName);
}
private static boolean getLock(String lockName, Integer count) {
long lockExpireTime = System.currentTimeMillis() + EXPIRED_TIME;
String stringOfLockExpireTime = String.valueOf(lockExpireTime);
boolean gotLock = false;
if(count > 300) {
return gotLock;
}
Long i = RedisManager.redisManager.setnx(lockName, stringOfLockExpireTime);
if (i == 1) {
gotLock = true;
return gotLock;
}
String value = RedisManager.redisManager.get(lockName, String.class);
if (value != null && isTimeExpired(value)){
value = RedisManager.redisManager.getSet(lockName, stringOfLockExpireTime);
if (value != null && isTimeExpired(value)) {
gotLock = true;
return gotLock;
}
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// 不处理异常睡眠异常
}
return getLock(lockName, ++count);
}
private static boolean isTimeExpired(String value) {
return Long.parseLong(value) < System.currentTimeMillis();
}
}