28

これらに対する答えを見つけようとしていますが、Google または Java ドキュメントで見つけることができません。

ケース 1:ConcurrentHashMap、スレッドt1がセグメントnから読み取り、同時に別のスレッドt2が同じセグメント nに書き込みたいとします。

質問 1:これら 2 つの操作は次々に実行されますか、それとも同時に実行されますか?


ケース 2:ConcurrentHashMap、スレッドt1がセグメントnに書き込みを行っており、同時に別のスレッドt2が同じセグメント nから読み取りたいとします。

質問 2:これら 2 つの操作は次々に実行されますか、それとも同時に実行されますか?

4

2 に答える 2

30

javadoc はあなたの両方の質問に答えると思います:

通常、取得操作 (get を含む) はブロックされないため、更新操作 (put および remove を含む) と重複する場合があります。検索は、開始時に保持されている最新の更新操作の結果を反映します。putAll や clear などの集計操作の場合、同時取得では、一部のエントリのみの挿入または削除が反映される場合があります。

セグメントは更新操作用です。

更新操作間で許可される同時実行数は、オプションの concurrencyLevel コンストラクター引数 (デフォルトは 16) によって決まります。これは、内部サイズ設定のヒントとして使用されます。

つまり、読み取りはブロックされません (揮発性変数の読み取りとして実装されます)。同じセグメントに書き込むと、書き込みが互いにブロックされる可能性があります。

于 2013-04-19T14:31:49.267 に答える