ホームページ >Java >&#&チュートリアル >Java が ConcurrentHashMap とカウンターを使用してロックを実装する方法の詳細な説明

Java が ConcurrentHashMap とカウンターを使用してロックを実装する方法の詳細な説明

黄舟
黄舟オリジナル
2017-05-28 09:12:342510ブラウズ

この記事では主に、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 に従ってキューを作成する 各スレッドがデータの処理後にロックを解放しない場合、カウンターは必要ありません。使用済み。ただし、ロックを解除する操作を追加すると、計算機を追加する必要があります。スレッドがロックを解放した後、同期されたコード ブロックを終了する前に、別のスレッドが tryLock メソッドを呼び出し、そのスレッドは別の オブジェクト のロックを取得することになり、結果として synchronized キーワードが使用されるためです。 userId のキューイングが失敗しました。

これを実現するために guava の

API を使用することもできます。 りー

以上がJava が ConcurrentHashMap とカウンターを使用してロックを実装する方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。