dポイントプレゼントキャンペーン実施中!

たとえば(無理やりな例ですが)、クラスが
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 に宣言
出来ないようなので。(出来るのならばやり方を教えてください。)

A 回答 (2件)

下の回答は全然自信ないので、


あくまで参考ということでお願いします。

スレッドは参照型の変数についても作業コピー持つんでしたっけ?
でも参照型変数のコピーといっても、参照アドレス自体はこの場合変わらないですし、
参照先の実体をコピーするはずもないでしょうし、

そう考えると、実は何も必要ない、のかも知れません。
    • good
    • 0

volatile 宣言はできないので、synchronized を使って


変数の作業コピーが最新の値であることを保証します。

setIsReady のほかに getIsReady メソッドも定義して、
それらを synchronized して、

while (!getIsReady(index)) {
  // ...
}

のように。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!