私は、各スレッドがこのArrayList 'X'にaddAll()を使ってデータを追加する複数のスレッドに渡されるArrayList 'X'を持っています。明らかに、ここではマルチスレッドの問題がありますが、コードのaddAll()部分を 'synchronized'(または)copyOnWriteArrayListを使用して作成するオプションがあります。volatileはスレッドの安全を保証しますか?このArrayListの例
私の質問は、このArrayList 'volatile'を宣言すると同じ目的を達成するでしょうか? JVMはこれらの読み取り/書き込み命令をそれに応じて順序付けし、マルチスレッドの問題を防止しますか?
いいえ、volatileはアクセスを同期させません。つまり、 'synchronized'(または他のロック)が対象です。 – tkausl
ここでは揮発性はお手伝いしません。揮発性とは、リストの内容ではなく参照を指します。 'synchronized'を使ってリストをロックするか、(可能であれば)各スレッドに独自のリストを保持させ、処理が終了したらリストを結合する必要があります。 –
http://shipilev.net/blog/2016/close-encounters-of-jmm-kind/#_pitfall_adding_volatiles_closer_to_the_problem_helps(時間がある場合は記事全体)を読むことをお勧めします。 – C4stor