- 締切済み
Java の配列の中身は volatile ですか?
たとえば(無理やりな例ですが)、クラスが private final boolean isReady[] = {false, false}; public void setIsReady(int index, boolean isReady) { this.isReady[index] = isReady; } public void doTask(int index) throws Exception { while (! isReady[index] ) { Thread.sleep(1000); } doSomething(); } のようなメンバとメソッドを持っていて、setIsReady() と doTask() がそれぞれ別のスレッドから呼ばれるような場合、doTask() の中の while ループはちゃんと抜け出す事が保証されますか? (もちろん isReady[index] を true にセットするとして。) isReady が配列ではなければ private volatile boolean isReady = false; としておけば安心できるのですが、配列の中身を明示的に volatile に宣言 出来ないようなので。(出来るのならばやり方を教えてください。)
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Harry_
- ベストアンサー率55% (36/65)
下の回答は全然自信ないので、 あくまで参考ということでお願いします。 スレッドは参照型の変数についても作業コピー持つんでしたっけ? でも参照型変数のコピーといっても、参照アドレス自体はこの場合変わらないですし、 参照先の実体をコピーするはずもないでしょうし、 そう考えると、実は何も必要ない、のかも知れません。
- Harry_
- ベストアンサー率55% (36/65)
volatile 宣言はできないので、synchronized を使って 変数の作業コピーが最新の値であることを保証します。 setIsReady のほかに getIsReady メソッドも定義して、 それらを synchronized して、 while (!getIsReady(index)) { // ... } のように。