复制代码代码如下:
حزمة com.happylements.odin.util ؛
استيراد static com.google.common.base.preconditions.checknotnull ؛
استيراد org.jetbrains.annotations.notnull ؛
استيراد com.happylements.odin.jedis.jedisclient ؛
استيراد com.happylements.rdcenter.commons.util.dateTimeUtil ؛
/**
* المستخدم: jude.wang
* التاريخ: 14-1-16
* الوقت: 上午 9:43
*/
الطبقة العامة متزامنة {
Static Final String user_lock_key_format = "user_lock_ ٪ d_ ٪ s" ؛
Static Final String Custom_lock_format = "custom_lock_ ٪ s" ؛
jedisclient النهائي الثابت العام = jedisclient.getInstance () ؛
السلسلة النهائية الثابتة العامة غير مقفلة = "0" ؛
سلسلة نهائية ثابتة مثبتة = "1" ؛
خاص ثابت نهائي int max_repeat_times = 10 ؛
notnull
السلسلة الثابتة العامة builduserlockkey (long userId ، مفتاح سلسلة notnull) {
checkNotnull (مفتاح) ؛
return string.format (user_lock_key_format ، userId ، key) ؛
}
notnull
السلسلة الثابتة العامة BuildCustomLockkey (مفتاح سلسلة Notnull) {
checkNotnull (مفتاح) ؛
إرجاع string.format (custom_lock_format ، المفتاح) ؛
}
/**
* 此方法可以因为拿不到锁而导致 العملية 没有执行
*
* مفتاح param
* seee com.happylements.odin.util.concurrentutil#buildCustomLockekey (سلسلة)
* seee com.happylements.odin.util.concurrentutil#builduserlockkey (Long ، String)
*
* param العملية
* throws com.happylements.odin.util.concurrentutil.operationNotexecexception
* العملية 没有被执行
*/
public static void dojobwithlock (مفتاح سلسلة notnull ، @notnull ilockoperation عملية) يلقي عملية kearnotexecexception {
مغلق منطقي = خطأ ؛
يحاول {
checkNotnull (مفتاح) ؛
checkNotnull (العملية) ؛
مغلق = قفل (مفتاح) ؛
} catch (throwable t) {
رمي التشغيل الجديد execexception (المفتاح ، t) ؛
}
يحاول {
إذا (مغلق) {
// system.out.println (thread.currentThRead () + "/t" + "lock") ؛
العملية.
} آخر {
رمي التشغيل الجديد execexception (مفتاح) ؛
}
} أخيراً {
إذا (مغلق) {
فتح (مفتاح) ؛
}
}
}
فتح الفراغ الثابت الخاص (مفتاح السلسلة) {
يحاول {
checkNotnull (مفتاح) ؛
String OldStatus = redisclient.getset (المفتاح ، غير مقفل) ؛
if (isUnlocked (oldstatus)) {
// lock-> dojob-> 过期-> فتح
// TODO LOG
}
} catch (throwable t) {
// TODO LOG
}
// system.out.println (thread.currentThRead () + "/t" + "inlock") ؛
}
isunlocked (حالة السلسلة) الثابتة الثابتة (حالة السلسلة) {
حالة الإرجاع == null || status.equals (Unlocked) ؛
}
قفل منطقي ثابت خاص (مفتاح سلسلة) {
مغلق منطقي = خطأ ؛
لـ (int i = 0 ؛ i <max_repeat_times ؛ i ++) {
String OldStatus = redisclient.getset (مفتاح ، مغلق) ؛
if (isUnlocked (oldstatus)) {
if (oldstatus == null) {
redisclient.expire (المفتاح ، dateTimeUtil.minute_second * 5) ؛
مغلق = صحيح ؛
استراحة؛
}
مغلق = صحيح ؛
استراحة؛
}
}
العودة مغلقة.
}
الواجهة الثابتة العامة ilockoperation {
void dojob () ؛
}
/**
* {link com.happylements.odin.util.concurrentutil.ilockoperation#dojob ()} 没有被执行
* 上层必须处理该异常 , 捕获到该异常可以 本次操作 本次操作 , 或者包装成 {link com.happylements.rdcenter.commons.throwable.heexception} 抛出去
*/
الطبقة الثابتة العامة العملية execexception يمتد الاستثناء {
Public OperationNotExecexception () {
}
Public OperationNotexecception (سلسلة S) {
سوبر (ق) ؛
}
Public OperationNotExecexception (سلسلة S ، قابلة للتسمية) {
سوبر (s ، رمي) ؛
}
Public OperationNotExecexception (قابلة للتسمية) {
سوبر (قابلين للتسمية) ؛
}
}
}