Насколько потокобезопасен EventListenerList? - PullRequest
2 голосов
/ 20 июля 2011

Javadoc для EventListenerLists говорит, что они предлагают «степень безопасности MT (при правильном использовании)». Что это значит? Я вижу, что создание копии массива защищает вас от удаления вещей во время стрельбы, поэтому при каких обстоятельствах это не удастся?

Точнее говоря, я пытаюсь создать EventBus, чтобы упростить несколько усложняющуюся передачу событий в многопоточном приложении. Я боюсь того, что может произойти, если несколько потоков пытаются запустить / отреагировать на события, я также боюсь обеспечить безопасность с помощью блокирующих механизмов, потому что смысл моих потоков состоит в том, чтобы не допустить блокировки моего пользовательского интерфейса при выполнении дорогостоящих задач.

1 Ответ

3 голосов
/ 20 июля 2011

Это не очень потокобезопасно. :-( (На основе OpenJDK 6 версии кода.)

То, что они сделали правильно:

  1. Методы add и remove помечены synchronized, поэтому вызов одного из них не будет происходить одновременно с вызовом другого
  2. Массивы списка слушателей никогда не изменяются; add и remove всегда присваивают новый массив listenerList

Что они сделали не так (к сожалению):

  1. Поле listenerList не volatile
  2. Метод getListenerList() не является synchronized

Это означает, что если вы вызываете add или remove в одном потоке, а затем вызываете getListenerList в другом потоке, изменения могут не наблюдаться, и вы все равно можете получить старую версию списка слушателей. .

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