复制代码代码如下:
包com.happylements.odin.util;
导入静态com.google.common.base.base.preconditions.checknotnull;
导入org.jetbrains.annotations.notnull;
导入com.happyelements.odin.jedis.jedisclient;
导入com.happyelements.rdcenter.commons.util.datetimeutil;
/**
*用户:Jude.Wang
*日期:14-1-16
*时间:上午9:43
*/
公共类Concurrentutil {
公共静态最终字符串user_lock_key_format =“ user_lock_%d_%s”;
公共静态最终字符串custom_lock_format =“ custom_lock_%s”;
公共静态最终jedisclient redisclient = jedisclient.getInstance();
公共静态最终字符串解锁=“ 0”;
公共静态最终字符串锁定=“ 1”;
私有静态最终int max_repeat_times = 10;
@notnull
public static String builduserlockkey(long userId,@notnull String键){
checknotnull(key);
return string.format(user_lock_key_format,userId,key);
}
@notnull
public static String buildcustomlockkey(@notnull String键){
checknotnull(key);
return string.format(custom_lock_format,键);
}
/**
*此方法可以因为拿不到锁而导致操作没有执行
*
* @param键
* @See com.happyelements.odin.util.concurrentutil#buildcustomlockkey(string)
* @See com.happyelements.odin.util.concurrentutil#builduserlockkey(long,string)
*
* @param操作
* @throws com.happyelements.odin.util.concurrentutil.operationnotexecexception
*操作没有被执行
*/
public static void dojobwithlock(@notnull String键,@notnull iLockoperation操作)抛出操作notexecexception {
布尔锁= false;
尝试 {
checknotnull(key);
checknotnull(操作);
锁定=锁(键);
} catch(可投掷T){
投掷新操作NoteXecexception(key,t);
}
尝试 {
如果(锁定){
// system.out.println(thread.currentthread() +“/t” +“ lock”);
aperation.dojob();
} 别的 {
投掷新操作NoteXecexception(key);
}
} 最后 {
如果(锁定){
解锁(键);
}
}
}
私有静态void解锁(字符串键){
尝试 {
checknotnull(key);
字符串oldstatus = redisclient.getSet(键,解锁);
如果(isunlocked(oldstatus)){
// lock-> dojob-->过期->解锁
// todo log
}
} catch(可投掷T){
// todo log
}
// system.out.println(thread.currentthread() +“/t” +“ unlock”);
}
私有静态布尔值isunlocked(字符串状态){
返回状态== null ||状态。平等(解锁);
}
私有静态布尔锁(字符串键){
布尔锁= false;
for(int i = 0; i <max_repeat_times; i ++){
字符串oldstatus = redisclient.getSet(键,锁定);
如果(isunlocked(oldstatus)){
if(oldstatus == null){
redisclient.expire(键,dateTimeUtil.minute_second * 5);
锁定= true;
休息;
}
锁定= true;
休息;
}
}
返回锁定;
}
公共静态接口iLockoperation {
void dojob();
}
/**
* {@link com.happyelements.odin.util.concurrentutil.ilockoperation#dojob()}没有被执行
*上层必须处理该异常,捕获到该异常可以,重试,或者包装成{@link com.happyelements.rdcenter.commons.throwable.heexception}抛出去
*/
公共静态类操作notexecexception扩展了异常{
public OperationNoteXecexception(){
}
公共操作NoteXecexception(String s){
超级
}
公共操作NoteXecexception(字符串S,可抛出){
超级(S,可投掷);
}
公共操作NoteXecexception(可投掷){
超级(可投掷);
}
}
}