
たとえば(無理やりな例ですが)、クラスが
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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
下の回答は全然自信ないので、
あくまで参考ということでお願いします。
スレッドは参照型の変数についても作業コピー持つんでしたっけ?
でも参照型変数のコピーといっても、参照アドレス自体はこの場合変わらないですし、
参照先の実体をコピーするはずもないでしょうし、
そう考えると、実は何も必要ない、のかも知れません。
No.1
- 回答日時:
volatile 宣言はできないので、synchronized を使って
変数の作業コピーが最新の値であることを保証します。
setIsReady のほかに getIsReady メソッドも定義して、
それらを synchronized して、
while (!getIsReady(index)) {
// ...
}
のように。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Googleログインボタンのデザイ...
-
プログラミングの問題です。大...
-
JDONWROADER2のエラー修復
-
スプレッドシートからリマイン...
-
googleスプレッドシートのスク...
-
googleスプレッドシートのGASに...
-
Verilogについて質問です。この...
-
論理回路設計をVerilogで行う問...
-
ゲーム開発の入門書を探しています
-
jdbcでinsert,delete,createをe...
-
session,requestはjspで未定義...
-
サーブレットをapacheで公開す...
-
下記のリストならno002が含まれ...
-
is this even a thing?
-
JAの支部?地域の農協のカード...
-
えハミルトン路と全域木のちが...
-
CSV出力を画面から選択したデー...
-
ショートカットキーについて
-
list の空は [] ってあわらすのに
-
あんまりお料理しないのに台所...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
String.containsの反対機能はあ...
-
Java初級 引数に適用できません
-
レコード件数の表示
-
StringBufferからStringへキャ...
-
readLine()ではじめから読み直...
-
C# 点の描き方をおしえてくだ...
-
C# の ByVal と ByRef について
-
Google Apps Script で getRang...
-
abstract と static を一緒に付...
-
return new使用時
-
説明文書でのメソッド・変数の...
-
CSVから読み込んだデータの保持...
-
Javaの問題なんですが、練習14-...
-
スーパークラスからサブクラス...
-
YYYYMMDD書式の日付に対する適...
-
java ジェネリックスに関して
-
シェルスクリプトからのJavaメ...
-
リストボックスの並べ替え (VB...
-
Java の配列の中身は volatile ...
-
なぜprotected overrideなのか
おすすめ情報