回答編集履歴

1

訂正

2018/05/07 08:56

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -1,8 +1,12 @@
1
+ 訂正:umyuさんご指摘の点を訂正します。
2
+
3
+
4
+
1
5
  > Thread.sleepやTimerを使って待たなければwhile文を抜け出すことはできないのでしょうか?
2
6
 
3
7
 
4
8
 
5
- いえ、必ずしもそうではありません。質問者さんのコードの詳細が不明なので抜け出せなかった原因をはっきりと指摘できませんが、少なくとも`Test.flag`はvolatile修飾子を付与しなければなりません。理由については「メモリバリア」「メモリフェンス」といった用語を調べるとよいと思います。
9
+ いえ、必ずしもそうではありません。質問者さんのコードの詳細が不明なので抜け出せなかった原因をはっきりと指摘できませんが、~~少なくとも`Test.flag`はvolatile修飾子を付与しなければなりません。~~例えば、`Test.flag`に`volatile`修飾子を付与するといった「実行順序の同期に関する配慮」をしなければなりません。理由については「メモリバリア」「メモリフェンス」といった用語を調べるとよいと思います。
6
10
 
7
11
 
8
12
 
@@ -30,7 +34,7 @@
30
34
 
31
35
  Object lock = new Object(); // 参照型のインスタンスなら何でもよい
32
36
 
33
- volatile boolean state;
37
+ boolean state; //(注)
34
38
 
35
39
 
36
40
 
@@ -72,6 +76,8 @@
72
76
 
73
77
  ```
74
78
 
79
+ (注:元の回答ではvolatileを付与していましたが、stateのread/writeが必ずsynchronizedブロック内にしかない上のような例ではvolatileは必要ないので上の例からvolatileを取りました)
80
+
75
81
 
76
82
 
77
83
  lockはどんな参照型インスタンスでもよく、上の例では例えばthisとかTest.classを使ってもかまいません。thisを使うなら