• 締切済み

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 に宣言 出来ないようなので。(出来るのならばやり方を教えてください。)

みんなの回答

  • Harry_
  • ベストアンサー率55% (36/65)
回答No.2

下の回答は全然自信ないので、 あくまで参考ということでお願いします。 スレッドは参照型の変数についても作業コピー持つんでしたっけ? でも参照型変数のコピーといっても、参照アドレス自体はこの場合変わらないですし、 参照先の実体をコピーするはずもないでしょうし、 そう考えると、実は何も必要ない、のかも知れません。

  • Harry_
  • ベストアンサー率55% (36/65)
回答No.1

volatile 宣言はできないので、synchronized を使って 変数の作業コピーが最新の値であることを保証します。 setIsReady のほかに getIsReady メソッドも定義して、 それらを synchronized して、 while (!getIsReady(index)) {   // ... } のように。

関連するQ&A