Ho una classe semplice che esegue alcuni calcoli nel proprio thread e riporta i risultati all'ascoltatore.java: devo dichiarare volatile la mia variabile membro listener condivisa?
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(...);
}
}
}
}
In qualsiasi momento, l'utente può chiamare setListener (null) se non vuole alcun evento per un certo periodo di tempo. Così, nel corsa function(), creo una copia di chi ascolta, quindi non posso correre in un NullPointerException che potrebbe accadere se l'ascoltatore è impostato su null dopo la ! = Null condizione di controllo riuscito . Nel mio caso, credo che questa sia un'alternativa corretta per la sincronizzazione.
La mia domanda è: devo dichiarare qui la variabile membro del listener come volatile? Ho letto molto su volatile, ma tutti gli esempi sembrano mirare ai tipi di dati di base (booleano, int, ...) e non agli oggetti. Quindi, quindi, non sono sicuro se gli oggetti dovrebbero/potrebbero essere dichiarati volatili. Credo di doverlo dichiarare come volatile, quindi il thread ha sempre l'ultima versione della variabile membro, ma non ne sono sicuro.
Grazie!
Proprio come un suggerimento - non rispondere veramente alla tua domanda lo ammetto - ma funzionerebbe meglio mettere un flag di tipo "abilitato" sul listener, e quindi piuttosto che avere il client imposta il Listener null o not-null , averlo impostatoEnabled (true) o setEnabled (false)? Questo ti aiuta a gestire un NPE inavvertito e ti impedisce anche di dover periodicamente istanziare nuovi oggetti Listener. –
@Japer D., Questa è davvero una soluzione davvero brutta che hai. – mre
@JimKiley Sono d'accordo con te. Tuttavia, stavo semplificando la mia domanda, quindi sembra un po 'strano. Ci scusiamo per questo. –