0

私はつのエントリでの動作の安全スレッド

class A { 
} 

ConcurrentHashMap<A, Integer> map = new ConcurrentHashMap<>(); 

public void fun() { 
    Integer count = map.get(Object); 
    if (count != null) { 
     map.put(Object, count+1); 
    } 
} 
public void add() { 
    // increase Object count by 1 
} 
public void remove() { 
    // deduct Object count by 1 
} 

どのように私は楽しい()スレッドセーフにすることができような操作をしたいですか?

私はこれを行う方法は、同期ブロック

public void fun() { 
    synchronized("") { 
     Integer count = map.get(Object); 
     if (count != null) { 
      map.put(Object, count+1); 
     } 
    } 
} 

を追加することです知っている。しかし、それを行うには、他の方法がありますか? それを行うライブラリがありますか?

thread safe entry processor?


は、私もまた ConcurrentHashMap.remove(key, value)

public void remove() { 
    int count = map.get(Object); 
    count -= 5; 
    if (count <= 0) { 
     map.remove(Object); 
    } else { 
     map.put(Object, count + 2); 
    } 
} 

Any ways to do this ? 
Thank you 
+0

http://stackoverflow.com/a/26214475/4764198をチェックしましたか? – arkki

+1

サンプルコードでは、空の文字列を同期させるかどうかは、インターンの振る舞いや正確な使用パターンに応じて機能するかもしれませんが、一般的な標準的な方法ではありません。同期を使用する場合は、マップ自体または専用のオブジェクトで同期する必要がありますが、空のStringでは同期しないでください。 – GPI

+0

使用しているJavaのバージョンは?これはJava 8では他のバージョンよりずっと簡単です。 –

答えて

-1

使用AtomicIntegerConcurrentHashMap.putIfAbsent()

のようなものを実装したい - それは与えられた値にマップされている場合にのみ、キーを削除します。

正確なロジック(上記の質問ではあまりよく定義されていません)を実装することが可能かどうかはわかりませんが、これらのメソッドは同様のことを行う際に非常に役立ちます。

その他のヒント(それが役に立つかもしれませんか、あまりないかもしれない):

ます(おそらく!)メソッドを使用することができます:computeIfAbsent、computeIfPresentを(または交換)、及び(キー、値)を削除します。 ConcurrentHashMapは、値がIntegersの場合に定義できます。

これは非常に汚い解決策になりますが、私はそれを使用することをお勧めしませんが、何か考えてみると非常に難しいかもしれません。

ヒントがさらに必要な場合は教えてください。

+0

これについてもっと教えてもらえますか?どうすればここで使うことができますか?ありがとう – Peng

+0

これは 'fun()'メソッドではまったく問題ありませんが、 'remove()'サンプルではこれがうまくいくかどうかわかりません。 – GPI

+0

あなたはユーザーを削除することができます – Slava

関連する問題