91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

相關推薦
师宗县| 福清市| 莒南县| 承德县| 兖州市| 顺义区| 红原县| 冀州市| 崇州市| 泰和县| 师宗县| 宣汉县| 邻水| 西盟| 新巴尔虎右旗| 铁岭市| 新安县| 固镇县| 三都| 马边| 百色市| 泰顺县| 丽水市| 依兰县| 盈江县| 林口县| 九龙坡区| 大连市| 咸丰县| 晋城| 宜川县| 六枝特区| 长顺县| 北辰区| 临桂县| 天镇县| 会理县| 乌拉特前旗| 新源县| 黄浦区| 全椒县|