Tengo una clase simple que hace algunos cálculos en su propio hilo e informa los resultados al oyente.java - ¿Tengo que declarar mi variable de miembro de escucha compartida como volátil?
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(...);
}
}
}
}
En cualquier momento, el usuario puede llamar setListener (nulo) si él no quiere ningún evento para un determinado período de tiempo. Así, en el run() función, se crea una copia del oyente, por lo que no se puede ejecutar en una NullPointerExceptionlo que podría suceder si el oyente se establece en NULL después de la ! = Null comprobación del estado tuvo éxito . En mi caso, creo que esta es una alternativa correcta para sincronizarlo.
Mi pregunta es: ¿debo declarar aquí que la variable del miembro oyente es volátil? He estado leyendo mucho sobre volátil, pero todos los ejemplos parecen enfocarse en los tipos de datos básicos (booleano, int, ...) y no en Objetos. Por lo tanto, no estoy seguro de si los Objetos deberían/podrían declararse también volátiles. Creo que tengo que declararlo como volátil, por lo que el hilo siempre tiene la última versión de la variable miembro, pero no estoy seguro.
Gracias!
Solo como sugerencia, no estoy respondiendo realmente a su pregunta, lo admito, pero ¿sería mejor poner un indicador de tipo "habilitado" en su Oyente, y luego, en lugar de tener al cliente configurado el Oyente nulo o no nulo? , ¿tiene setEnabled (true) o setEnabled (false)? Eso lo ayuda a resolver el problema de manejar un NPE inadvertido, y también evita que tenga que crear instancias periódicas de nuevos objetos Listener. –
@Japer D., Esa es una solución realmente fea que tienes allí. – mre
@JimKiley Estoy de acuerdo contigo. Sin embargo, estaba simplificando mi pregunta, por lo tanto, se ve un poco extraño. Disculpas por eso. –