9

私が知っているJavadocからConcurrentHashMap.replaceはアトミックですが、どうConcurrentHashMap.putですか? ソースコードでの実装が異なっていることがわかりますが、それらの違いを理解することはできません。これら 2 つの方法の使用方法に関するガイドラインを提供する専門家はいますか?

4

3 に答える 3

14

それらは機能的に異なります。replace指定されたキーの下に値がすでに格納されている場合にのみ、キーと値のペアを格納します。の API ドキュメントでは、次のようにreplace説明されています。

現在何らかの値にマップされている場合にのみ、キーのエントリを置き換えます。これは、

if (map.containsKey(key)) {
    return map.put(key, value);
} else return null;

ただし、アクションはアトミックに実行されます。

于 2012-08-15T10:15:32.047 に答える
2

put()拡張するクラスから継承されAbstractMapます。ConcurrentHashMap特定の同時実行契約はありませんput()。この継承によりConcurrentHashMap、マップの「従来の」コンテキストでの使用が可能になります。しかし、AbstractMapアトミックなメソッドはありません。

replace()インターフェイスの要求に応じて実装されConcurrentMapます。このインターフェイスには、 のようなアトミック操作が必要ですreplace()。このインターフェースのメソッドのみが、並行対応コードで使用されます。

アトミックput()操作を行うには、同じインターフェイスputIfAbsent()から来るを使用します。ConcurrentMap

于 2012-08-15T12:25:18.327 に答える