Представьте, что у меня есть этот класс:
class Notifier {
public Listener listener;
public void notify() {
if (listener != null) {
listener.stuffHappens();
}
}
}
Этот код неверен в случае, если listener
можно изменить из другого потока. Давайте исправим это:
class Notifier {
public volatile Listener listener;
public void notify() {
Listener l = listener;
if (l != null) {
l.stuffHappens();
}
}
}
Код правильный сейчас, но метод notify()
выглядит странно изолированно. Представьте себе больший класс со смесью изменчивых и регулярных полей, используемых в одном и том же методе, и вы получите картину.
Мой первый импульс - назвать переменную volatileListener
--- при условии, что она частная и, конечно, есть setListener()
, но я представляю себе реакцию коленного рефлекса "венгерская запись - это зло" от многих людей.
Итак, существуют ли установленные практики / соглашения? Или, может быть, есть некоторые закономерности, позволяющие систематически избегать подобных ситуаций. Что вы делаете, когда пишете многопоточный код?