- 相關(guān)推薦
java使用ConcurrentHashMap和計(jì)數(shù)器實(shí)現(xiàn)鎖的方法
java如何使用ConcurrentHashMap和計(jì)數(shù)器實(shí)現(xiàn)鎖?下面是由百分網(wǎng)小編為大家整理的java使用ConcurrentHashMap和計(jì)數(shù)器實(shí)現(xiàn)鎖的方法,喜歡的可以收藏一下!了解更多詳情資訊,請關(guān)注應(yīng)屆畢業(yè)生考試網(wǎng)!
java 使用ConcurrentHashMap和計(jì)數(shù)器實(shí)現(xiàn)鎖
在某些場景下,我們想讓線程根據(jù)某些業(yè)務(wù)數(shù)據(jù)進(jìn)行排隊(duì),簡單代碼如下:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.atomic.AtomicInteger;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{
//處理業(yè)務(wù)
}
finally{
unLock(lock);
}
}
}
private LockObj tryLock(Long key) {
LockObj curVal = new LockObj(key);
LockObj preVal = lockMap.putIfAbsent(key, curVal);if (null == preVal) {curVal.inc();
return curVal;
}
else{
preVal.inc();
}
return preVal;
}
private void unLock(LockObj lock){
if (lock.dec() <= 0){
lockMap.remove(lock.getKey());
}
}
public class LockObj {
private long key = 0;
private AtomicInteger count = new AtomicInteger(0);public LockObj(long key){this.key = key;
}
public int inc(){
return count.incrementAndGet();
}
public int dec(){
return count.decrementAndGet();
}
public long getKey(){
return key;
}
@Override
public String toString() {
return "LockObj [key=" + key + ", count=" + count + "]";}
}
}
按照userId來排隊(duì),如果每個(gè)線程處理數(shù)據(jù)后不釋放鎖的話,那么可以不利用計(jì)數(shù)器。但是加了釋放鎖的操作,則必須加上計(jì)算器。因?yàn)楫?dāng)線程把鎖釋放掉后,還沒來得及退出synchronized 代碼塊時(shí),另外一個(gè)線程調(diào)用了tryLock方法,那該線程將拿到另外一個(gè)對象的鎖,導(dǎo)致利用synchronized 關(guān)鍵字進(jìn)行userId排隊(duì)失敗。
也可以利用guava的API來實(shí)現(xiàn)。
import com.google.common.collect.Interner;import com.google.common.collect.Interners;public class TestServiceImpl {Interner<String> pool = Interners.newWeakInterner();public void test(Long userId) throws OspException {synchronized ( pool.intern(String.valueOf(userId))){//處理業(yè)務(wù)操作}
}
}
【java使用ConcurrentHashMap和計(jì)數(shù)器實(shí)現(xiàn)鎖的方法】相關(guān)文章:
JAVA實(shí)現(xiàn)生成GUID的方法06-02
關(guān)于Java動態(tài)實(shí)現(xiàn)的方法08-23
java使用動態(tài)代理來實(shí)現(xiàn)AOP05-29
Java使用方法集錦09-07
使用Java的枚舉類型的方法10-19
Java重載使用方法08-22
java的split方法使用范例10-06