<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>
            java語言

            java使用ConcurrentHashMap和計數器實現鎖的方法

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

            java使用ConcurrentHashMap和計數器實現鎖的方法

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

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

              }

              }

             

            【java使用ConcurrentHashMap和計數器實現鎖的方法】相關文章:

            JAVA實現生成GUID的方法06-02

            Java實現多線程的方法11-10

            關于Java動態實現的方法08-23

            java使用動態代理來實現AOP05-29

            實現java屏幕抓屏的方法08-24

            Java使用方法集錦09-07

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

            Java重載使用方法08-22

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

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看