亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ConcurrentHashMap如何在java項目中使用

發布時間:2020-11-21 15:11:01 來源:億速云 閱讀:195 作者:Leah 欄目:編程語言

ConcurrentHashMap如何在java項目中使用?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

java 使用ConcurrentHashMap

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

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

也可以利用guava的API來實現。

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))){
      //處理業務操作
    }
  }
}

看完上述內容,你們掌握ConcurrentHashMap如何在java項目中使用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

相關推薦
资兴市| 安塞县| 普兰店市| 昭平县| 阿克陶县| 健康| 永福县| 余江县| 巴楚县| 富宁县| 无棣县| 大同市| 崇左市| 柞水县| 五莲县| 四会市| 阜城县| 台州市| 汤阴县| 南宁市| 天全县| 东方市| 天水市| 大庆市| 侯马市| 平罗县| 雅江县| 龙海市| 南通市| 印江| 保康县| 奉化市| 西乌珠穆沁旗| 黑龙江省| 独山县| 西平县| 本溪| 巴彦县| 霞浦县| 互助| 额济纳旗|