У меня есть простой класс, который выполняет некоторые вычисления в собственном потоке и сообщает результаты слушателю.
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 (null) , если он не хочет никаких событий в течение определенного периода времени. Итак, в функции run () я создаю копию слушателя, поэтому я не могу столкнуться с исключением NullPointerException , которое может произойти, если для слушателя установлено значение null после ! = Null проверка условия выполнена успешно. В моем случае я считаю, что это правильная альтернатива для его синхронизации.
Мой вопрос: следует ли мне объявить здесь переменную участника-слушателя как изменчивую? Я много читал о volatile, но все примеры, похоже, нацелены на основные типы данных (логические, int, ...), а не на объекты. Поэтому я не уверен, следует ли / можно ли объявлять объекты изменчивыми. Я считаю, что должен объявить его как изменчивый, поэтому в потоке всегда будет последняя версия переменной-члена, но я не уверен.
Спасибо!