私は、独自のスレッドでいくつかの計算を行い、その結果をリスナーに報告する単純なクラスを持っています。いずれかの時点でjava - 共有リスナーメンバー変数をvolatileとして宣言する必要がありますか?
class Calculator extends Thread {
protected Listener listener;
public void setListener(Listener l) {
listener = l;
}
public void run() {
while (running) {
... do something ...
Listener l = listener;
if (l != null) {
l.onEvent(...);
}
}
}
}
彼は一定の期間のためのイベントを望んでいない場合、ユーザーはsetListener(ヌル)を呼び出すことができます。したがって、のrun()関数では、私はNullPointerExceptionに入ることができないので、リスナーのコピーを作成します。!= nullの後にリスナーがnullに設定された場合に起こる可能性がある条件チェックが成功しました。私の場合は、これを同期するための正しい選択だと私は信じています。
私の質問は、ここでリスナーメンバー変数をvolatileとして宣言する必要がありますか?私は揮発性について多くのことを読んできましたが、すべての例はオブジェクトではなく、基本データ型(boolean、int、...)を対象としています。だから、私はオブジェクトが揮発性であると宣言されるべきかどうかはわかりません。私は揮発性と宣言しなければならないと信じているので、スレッドは常にメンバ変数の最新バージョンを持っていますが、わかりません。
ありがとうございます!
あなたの質問に本当に答えるわけではありませんが、リスナーに '有効'タイプのフラグを設定して、クライアントにリスナーのnullまたはnot-nullを設定させるのではなく、setEnabled(true)またはsetEnabled(false)していますか?これにより、不注意なNPEを処理するという問題が回避され、定期的に新しいListenerオブジェクトをインスタンス化する必要がなくなります。 –
@Japer D.、それは本当に、本当に、あなたがそこに持っている醜い解決策です。 – mre
@JimKiley私はあなたに同意します。しかし、私は私の質問を単純化していたので、少し奇妙に見えます。それについての謝罪。 –