java使用ConcurrentHashMap和計數器實現鎖的方法
java如何使用ConcurrentHashMap和計數器實現鎖?下面是由本站小編爲大家整理的java使用ConcurrentHashMap和計數器實現鎖的方法,喜歡的可以收藏一下!瞭解更多詳情資訊,請關注應屆畢業生考試網!
java 使用ConcurrentHashMap和計數器實現鎖
在某些場景下,我們想讓線程根據某些業務數據進行排隊,簡單代碼如下:
import yList;
import Map;
import ;
import ;
import urrentHashMap;import icInteger;public class TestServiceImpl {private static ConcurrentHashMap<Long, LockObj> lockMap = new ConcurrentHashMap<Long, LockObj>(40);public void test(Long userId){LockObj lock = tryLock(userId);
synchronized (lock) {
try{
//處理業務
}
finally{
unLock(lock);
}
}
}
private LockObj tryLock(Long key) {
LockObj curVal = new LockObj(key);
LockObj preVal = fAbsent(key, curVal);if (null == preVal) {();
return curVal;
}
else{
();
}
return preVal;
}
private void unLock(LockObj lock){
if (() <= 0){
ve(ey());
}
}
public class LockObj {
private long key = 0;
private AtomicInteger count = new AtomicInteger(0);public LockObj(long key){ = key;
}
public int inc(){
return ementAndGet();
}
public int dec(){
return ementAndGet();
}
public long getKey(){
return key;
}
@Override
public String toString() {
return "LockObj [key=" + key + ", count=" + count + "]";}
}
}
按照userId來排隊,如果每個線程處理數據後不釋放鎖的`話,那麼可以不利用計數器。但是加了釋放鎖的操作,則必須加上計算器。因爲當線程把鎖釋放掉後,還沒來得及退出synchronized 代碼塊時,另外一個線程調用了tryLock方法,那該線程將拿到另外一個對象的鎖,導致利用synchronized 關鍵字進行userId排隊失敗。
也可以利用guava的API來實現。
import rner;import rners;public class TestServiceImpl {Interner<String> pool = eakInterner();public void test(Long userId) throws OspException {synchronized ( rn(eOf(userId))){//處理業務操作}
}
}
相關文章
-
Javascript中arguments對象的詳解和使用方法
一、arguments使用方法通過方括號語法訪問每一個元素var fun = function(one) { (arguments[0]); (arguments[1]); (arguments[2]);}fun(1, 2, 3)// 1// 2// 3通過length屬性,查看到底要幾個參數function fun() { ret -
java如何利用java.net.URLConnection發送HTTP請求
原創主要材料:泡沫板所需工具:衛生紙製作步驟:第1步:畫圖紙 在中間畫對稱軸第2步:對摺剪下來第3步:在泡沫板上描邊第4步:用小刀裁下來第5步:脫脂棉球拉長 沒有的童鞋可以不用弄第6步:中間系線第7步:粘上做胸部第8步:用衛生紙加水 -
用 Javascript 實現錨點(Anchor)間平滑跳轉
複製代碼 代碼如下:<script type="text/javascript">// 說明:用 Javascript 獲取滾動條位置等信息// 來源 :ThickBox 2.1function getScroll(){var t, l, w, h;if (mentElement && llTop) {t = llTop;l = llLef -
Should Private Cars Be Encouraged in China高中英語作文
總結就是把一個時間段取得的成績、存在的問題及得到的經驗和教訓進行一次全面系統的總結的書面材料,它可以幫助我們總結以往思想,發揚成績,不妨讓我們認真地完成總結吧。總結一般是怎麼寫的呢?以下是小編爲大家整理的五四 -
My Plan for the Summer Vacation英語作文
在平平淡淡的日常中,大家最不陌生的就是作文了吧,藉助作文人們可以反映客觀事物、表達思想感情、傳遞知識信息。一篇什麼樣的'作文才能稱之爲優秀作文呢?以下是小編爲大家整理的My Plan for the Summer Vacation英語作 -
英語美文:Olympic Fund Scratchcard Launched
英國國家彩票運營商卡米洛特公司日前決定,將通過發行彩票的方式爲2012年倫敦奧運會募集資金,第一種彩票將以刮刮卡的形式出現,其準備工作已經啓動。Go For Gold, the first scratchcard to raise funds for London"s 201 -
JavaScript instanceof 的使用方法有哪些
在 JavaScript 中,判斷一個變量的類型嚐嚐會用 typeof 運算符,在使用 typeof 運算符時採用引用類型存儲值會出現一個問題,無論引用的是什麼類型的對象,它都返回 “object”。這就需要用到instanceof來檢測某個對象是不是 -
關於javascript中encodeURI和decodeURI的使用方法
關於java script中encodeURI和decodeURI的使用方法 一、基本概念encodeURI和decodeURI是成對來使用的,因爲瀏覽器的`地址欄有中文字符的話,可以會出現不可預期的錯誤,所以可以encodeURI把非英文字符轉化爲英文編 -
高中生優秀英語作文:Have a break away from electronics
回顧在中醫科的實習工作,感觸很深,收穫頗豐。談談一些心得體會。本文是中醫科的實習心得體會,歡迎閱讀。中醫科的實習心得體會一:在中醫科的實習即將結束,在這一個多月的實習期間,我遵紀守法,遵守醫院及醫院各科室的各項規章 -
Thinkpad筆記本開機顯示Tointerrruptnormalstartup解決方法
Thinkpad筆記本開機顯示To interrrupt normal startup的解決方法1、先等待5-6分鐘,如果系統又恢復了正常,說明可能是系統硬盤或者風扇區出了問題;2、假如過了5-6分鐘依然沒有反應,則可嘗試先拆掉筆記本電池在裝上;3、或