以下のコードに潜在的な同時実行性の問題があるかどうかを調べようとしています。具体的には、揮発性変数に関連する可視性の問題。揮発性は次のように定義されます。この変数の値はスレッドローカルでキャッシュされることはありません。すべての読み取りと書き込みは「メインメモリ」に直接送信されます。
public static void main(String [] args)
{
Test test = new Test();
// This will always single threaded
ExecutorService ex = Executors.newSingleThreadExecutor();
for (int i=0; i<10; ++i)
ex.execute(test);
}
private static class Test implements Runnable {
// non volatile variable in question
private int state = 0;
@Override
public void run() {
// will we always see updated state value? Will updating state value
// guarantee future run's see the value?
if (this.state != -1)
this.state++;
}
}
上記のシングルスレッドエグゼキュータの場合:
test.stateを不揮発性にしても大丈夫ですか?言い換えると、連続するすべてのTest.run()(これも、エグゼキュータがシングルスレッドであるため、同時にではなく順次発生します)は、常に更新されたtest.state値を参照しますか?そうでない場合、Test.run()を終了すると、スレッドで行われた変更がローカルでメインメモリに書き戻されることが保証されませんか?それ以外の場合、スレッドの終了時にそうでない場合、ローカルで行われた変更がメインメモリに書き戻されるのはいつですか?