我有一個簡單的類,它在自己的線程中執行一些計算並將結果報告給偵聽器。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條件檢查成功。就我而言,我相信這是同步它的正確選擇。
我的問題是:我應該在這裏聲明listener成員變量爲volatile嗎?我一直在閱讀很多關於volatile的知識,但所有的例子似乎都是針對基本數據類型(boolean,int,...),而不是Object。因此,我不確定對象是否應該/可以被聲明爲不穩定。我相信我必須將其聲明爲volatile,所以線程始終具有最新版本的成員變量,但我不確定。
謝謝!
就像一個建議 - 沒有真正回答你的問題我承認 - 但它會更好地把一個'啓用'類型標誌放在您的監聽器上,然後而不是讓客戶端設置監聽器爲空或非空,它有setEnabled(true)或setEnabled(false)?這會讓你圍繞處理無意的NPE的問題,並且還會阻止你不得不定期實例化新的Listener對象。 –
@Japer D.,這真是一個非常非常醜陋的解決方案。 – mre
@JimKiley我同意你的意見。但是,我簡化了我的問題,因此看起來有點奇怪。爲此道歉。 –