この記事では主に、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 サイトの他の関連記事を参照してください。