2016-07-20 7 views
0

の値オブジェクトをロック:私たちは私たちが学んだことはできませんHashMapの、のエントリのみをロックする同期ブロックを使用できるかどう Can we use Synchronized for each entry instead of ConcurrentHashMap?は、この記事でのConcurrentHashMap

私は尋ねました。今、私の質問は、ArrayList、またはTreeMap型の値を持つConcurrentHashMap(hashMapではない)がある場合、その方法を(同期を使用して)使用できるかどうかです。ここに意味するもの:

ConcurrentHashMap<String, ArrayList<String>> map = new ConcurrentHashMap<>(); 




    synchronized (map.get("key")) { 
     //do something with the array thread-safely, 

    } 

安全ですか?私が求めているのは、テストによってこの種の問題をチェックする方法がわからないということです。

+0

_それは安全ですか?_あなたが値で何をしているのかわからない限り、_は答えられません。あなたのコードの別の部分はそれらを別々に使用していますか?彼らはそれらにアクセスする前に、対応するモニターにロックされていますか? –

+0

あなたは正しいです。私はarraylistを使用して同期ブロックにアクセスしたいときはいつでもスレッドセーフであることを意味しますか? –

答えて

0

putIfAbsent操作を使用している限り、スレッドセーフです。同じオブジェクト参照に対して常に同期(ブロッキング)します。

+0

なぜ私はputIfAbsentが必要ですか? –

+0

'' map.put( "key"、new Object()); 'を同時に多くのスレッドで呼び出すとしましょう。各スレッドは、複数のオブジェクトで同期できるように成功することができます。代わりに 'putIfAbsent(" key "、new Object())'を実行すると、1つのスレッドだけが成功し、その単一オブジェクトで同期します。 –

関連する問題