SC 22春 午後1問1設問2(3) volatile synchronized

グローバル変数の同期を取る方法を書くが、volatileは意味をなさないそうだ。

なぜか:

Javaにはメインメモリとスレッドごとのキャッシュ領域があり、

synchronizedはメインメモリのフィールドに直接ロックをかける。

一方、volatileはスレッドのキャッシュに変数を取得する際に最新の値を取得するので、他スレッドが値取得→自スレッドが値取得→他スレッドが値変更
となったときに変更が失われてしまう。

Javaスレッドメモ(Hishidama's Java thread Memo)