1

私はArrayListの安全な出版に疑念を抱いています。j.u.c.ConcurrentHashMapを配置した後、ArrayListを安全に公開する予定ですか?

I有しコード:

private final Map<Long, SomeStuff> map = new ConcurrentHashMap<>(); 
//Called by Thread 1 
public void write() { 
    List list = new ArrayList<>(); 
    for (int i = 0; i <100 ; i++) { 
     list.add(new SomeStuff(i)) 
    } 
    map.put(1L,list) 
} 
// Called by Thread 2 
public void read() { 
    List list = map.get(1L); 
} 

ウィル正しい状態でmap.get(1L)の戻りのArrayListのivocation(正しいサイズたとえばを有しますか)?

ArrayListの要素はどうですか?要素は安全に公開されますか?

ConcurrentHashMap.putがノードのロックによって保護されていることがわかりましたが、変更されますが、ConcurrentHashMap.getはthrought Unsafe.getObjectVolatileを実行します。

と私は、ArrayListのが危難に

感謝を発表するかもしれないと思います!

答えて

0

短い答え:はい、ArrayListオブジェクトは、要素とともに安全に公開されます。

一般に、クラスのソースコードを調べて、スレッドの安全性についての結論を出すべきではありませんが、クラス/インタフェースjavadocで指定された保証に頼るべきです。私は、このようなアプローチについて詳述している本書「Java Concurrency in Practice」を強くお勧めします。

界面準位(のConcurrentHashMapによって実現される)のConcurrentMap:キーまたは値起こるとしてのConcurrentMapにオブジェクトを配置する前に、他の同時コレクション、スレッド内のアクションと同様に:

メモリ一貫性効果 - 他のスレッドのConcurrentMapからそのオブジェクトにアクセスまたは削除された後のアクション

これは、「put」の前に起こったことが、後で同じオブジェクトに「get」するスレッドに見えることを意味します。つまり、「取得」が「配置」の後に行われる場合、2つ目のスレッドはすべての要素を持つ「良い」ArrayListオブジェクトを表示します。ここ

そして約安全で出版されていませんが、覚えておくだけのものである:

のArrayList自身(そしておそらくあなたの要素のクラス)スレッドセーフではありません。しかし、他のいくつかのスレッドからそれらのオブジェクトを変更しない限り、それで問題はありません。 「Java Concurrency in Practice」の本で説明したように、これは「シリアルスレッドの制限」です。つまり、スレッドセーフではないオブジェクトをあるスレッドから別のスレッドに安全にパブリッシュしてスレッドからスレッドへ「所有権」を移すことができますオブジェクトを特定の時点で「スレッド限定」にすることができます。私が言ったように、あなたがそれが他の場所から修正されていないことを確認した場合にのみ適用されます。

+0

お返事ありがとうございます@Ruslan。 – BakomchevDmitriy

1

ConcurrentHashMapのは、スレッドセーフであるが、読者は作家のput呼び出しの前getを呼び出し、結果nullなる場合

が意味ArrayListのではないでしょう。作家が読者のget呼び出しの前に置く呼び出す場合、結果はあなたがリストに(下記のコード)put

for (int i = 0; i <100 ; i++) { 
    list.add(new SomeStuff(i)) 
} 

を項目を追加する場合、それはリストのでOKとなりますので、List object

になります読者からアクセスできない

もしそれがputの後にあれば、それは読者からアクセス可能であり、読者とライターは同時にArrayListを読み書きするでしょう。これは、ArrayListがスレッドセーフではないため、問題を引き起こす可能性があります。

+0

お返事ありがとうございます@ sungjin-steve-yoo メモリの可視性はどうですか?書き込み後にCPUキャッシュがフラッシュされますか? – BakomchevDmitriy

+0

@ user3356477 ConcurrentHashMap https://www.burnison.ca/articles/the-concurrency-of-concurrenthashmapの詳細については、この記事を参照してください。 –

+0

@ user3356477 visibilityについて - 私の答えはhttps://stackoverflow.com/questions/を参照してください。 45059031/will-the-arraylist-be-published-juc-concashhashma/45170119#45170119 – Ruslan

関連する問題