亚洲一级免费看,特黄特色大片免费观看播放器,777毛片,久久久久国产一区二区三区四区,欧美三级一区二区,国产精品一区二区久久久久,人人澡人人草

java語言

java使用ConcurrentHashMap和計數(shù)器實現(xiàn)鎖的方法

時間:2025-05-31 10:06:56 java語言 我要投稿
  • 相關推薦

java使用ConcurrentHashMap和計數(shù)器實現(xiàn)鎖的方法

  java如何使用ConcurrentHashMap和計數(shù)器實現(xiàn)鎖?下面是由百分網(wǎng)小編為大家整理的java使用ConcurrentHashMap和計數(shù)器實現(xiàn)鎖的方法,喜歡的可以收藏一下!了解更多詳情資訊,請關注應屆畢業(yè)生考試網(wǎng)!

  java 使用ConcurrentHashMap和計數(shù)器實現(xiàn)鎖

  在某些場景下,我們想讓線程根據(jù)某些業(yè)務數(shù)據(jù)進行排隊,簡單代碼如下:

  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è)務

  }

  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來排隊,如果每個線程處理數(shù)據(jù)后不釋放鎖的話,那么可以不利用計數(shù)器。但是加了釋放鎖的操作,則必須加上計算器。因為當線程把鎖釋放掉后,還沒來得及退出synchronized 代碼塊時,另外一個線程調(diào)用了tryLock方法,那該線程將拿到另外一個對象的鎖,導致利用synchronized 關鍵字進行userId排隊失敗。

  也可以利用guava的API來實現(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è)務操作}

  }

  }

 

【java使用ConcurrentHashMap和計數(shù)器實現(xiàn)鎖的方法】相關文章:

JAVA實現(xiàn)生成GUID的方法06-02

Java實現(xiàn)多線程的方法11-10

關于Java動態(tài)實現(xiàn)的方法08-23

java使用動態(tài)代理來實現(xiàn)AOP05-29

實現(xiàn)java屏幕抓屏的方法08-24

Java使用方法集錦09-07

使用Java的枚舉類型的方法10-19

Java重載使用方法08-22

java的split方法使用范例10-06