复制代码代码如下:
paket com.happyelements.odin.util;
impor statis com.google.common.base.preconditions.checknotnull;
impor org.jetbrains.annotations.notnull;
impor com.happyelements.odin.jedis.jedisclient;
impor com.happyelements.rdcenter.commons.util.dateTimeutil;
/**
* Pengguna: Jude.wang
* Tanggal: 14-1-16
* Waktu: 上午 9:43
*/
Concurrentutil kelas publik {
string final public static user_lock_key_format = "user_lock_%d_%s";
string final public static custom_lock_format = "custom_lock_%s";
public static final jedisclient redisclient = jedisclient.getInstance ();
Public Static Final String Unlocked = "0";
string final statis publik terkunci = "1";
private static final int max_repeat_times = 10;
@Notnull
string statis public buildUserLockKey (long userid, @notnull string key) {
checknotnull (kunci);
return string.format (user_lock_key_format, userid, key);
}
@Notnull
string statis public buildCustomLockKey (@notnull string key) {
checknotnull (kunci);
return string.format (custom_lock_format, key);
}
/**
* 此方法可以因为拿不到锁而导致 Operasi 没有执行
*
* Kunci @param
* @see com.happyelements.odin.util.concurrentutil#buildcustomlockKey (string)
* @see com.happyelements.odin.util.concurrentutil#builduserlockkey (panjang, string)
*
* Operasi @param
* @throws com.happyelements.odin.util.concurrentutil.operationNotExecException
* Operasi 没有被执行
*/
public static void dojobwithlock (@notnull tombol string, @notnull ilockoperation operasi) melempar OperationNotExecException {
boolean terkunci = false;
mencoba {
checknotnull (kunci);
checknotnull (operasi);
terkunci = kunci (kunci);
} catch (Throwable t) {
Lempar OperationNotExecException baru (kunci, t);
}
mencoba {
if (terkunci) {
// System.out.println (thread.currentThread () + "/t" + "lock");
operasi.doJob ();
} kalau tidak {
Lempar OperationNotExecException baru (kunci);
}
} Akhirnya {
if (terkunci) {
buka kunci (kunci);
}
}
}
private static void unlock (tombol string) {
mencoba {
checknotnull (kunci);
String oldstatus = redisclient.getset (tombol, tidak terkunci);
if (isunlocked (oldstatus)) {
// lock-> dojob-> 过期-> buka kunci
// log todo
}
} catch (Throwable t) {
// log todo
}
// System.out.println (thread.currentThread () + "/t" + "buka kunci");
}
private static boolean isunlocked (status string) {
Status pengembalian == NULL || status.Equals (tidak terkunci);
}
private static boolean lock (tombol string) {
boolean terkunci = false;
untuk (int i = 0; i <max_repeat_times; i ++) {
String oldstatus = redisclient.getset (tombol, terkunci);
if (isunlocked (oldstatus)) {
if (oldstatus == null) {
redisClient.Expire (key, datetimeutil.minute_second * 5);
terkunci = true;
merusak;
}
terkunci = true;
merusak;
}
}
kembali terkunci;
}
ILockOperation antarmuka statis publik {
batal dojob ();
}
/**
* {@link com.happyelements.odin.util.concurrentutil.ilockoperation#dojob ()} 没有被执行
?
*/
Public Static Class OperationNotExecException memperluas Exception {
Operasi publikNotExecException () {
}
Operasi publikNotExecException (String S) {
super (s);
}
Operasi PublikNotExecException (String S, Throwable Throwable) {
Super (S, Throwable);
}
Operasi PublikNotExecException (Throwable Throwable) {
Super (Throwable);
}
}
}