Является ли java.util.Observable потокобезопасным? - PullRequest
9 голосов
/ 23 сентября 2011

В классах шаблонов java's Observer Observer и Observable , выполняются ли вызовы для notifyObservers (Object arg0) объектов Observable (Object arg0) * в разных потоках, поточно-безопасны?

Пример: У меня есть несколько потоков, все Observables , которые будут вызывать notifyObservers (...) очень часто. Все эти потоки сообщают одному объекту Observer .

Буду ли я сталкиваться с проблемами параллелизма, и что может быть лучше для решения этой проблемы? Мне известно о возможном решении с использованием прослушивателей событий. Однако я не уверен, как это реализовать, а также хотел бы придерживаться реализации шаблона Observer, если это возможно.

1 Ответ

7 голосов
/ 23 сентября 2011

Из исходного кода (у меня есть исходный код Java 5, но он должен быть таким же для Java 6 и 7) кажется, что у вас есть синхронизация только на самом Observable.

Из метода notifyObservers(...)Observable):

synchronized (this) {
  //the observers are notified in this block, with no additional synchronization
}

Таким образом, если Observer не изменяет какие-либо общие данные, все будет в порядке. Если это произойдет - вы можете сделать несколько звонков на update(Observable, Object) с разными Observable s - вам нужно добавить синхронизацию для этих общих данных самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...