Поделиться потокобезопасным набором для нескольких классов - PullRequest
0 голосов
/ 07 апреля 2011

Этот вопрос относится к одному из моих предыдущих вопросов .

Я хотел бы иметь потокобезопасный набор, к которому я могу обращаться и изменять в различных классах, некоторые Runnables, а некоторые нет.

Согласно JavaDoc я получаю потокобезопасный набор с

  Set s = Collections.synchronizedSet(new HashSet());

Но теперь я хочу поделиться этим набором через мойпрограмма.Можно ли поместить его в контекст приложения и инициализировать в XML?

Ответы [ 4 ]

1 голос
/ 08 апреля 2011

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

В большинстве случаев ConcurrentHashMap - мой предпочтительный выбор.Начиная с Java 6, это синхронизация для создания набора из карты с использованием Collections.newSetFromMap ().

Set<Type> concurrentSet = Collections.newSetFromMap(new ConcurrentHashMap<Type,Boolean>());
1 голос
/ 07 апреля 2011

Если вы посчитали его достаточным для передачи в свой Runnable, то я не вижу причин, по которым он также не подходит для контекста вашего приложения.

Я должен отметить, что, как правило, глобальные переменные открывают двери для очень трудных для отслеживания ошибок, и вы должны строго рассмотреть альтернативы наличию единого контекста в масштабе приложения, который может быть изменен во время выполнения. (Если это только когда-либо читается, никогда не пишется, у вас вообще нет проблем, и я бы подумал вместо этого использовать Collections.unmodifiableSet(generatedHashset);.

0 голосов
/ 07 апреля 2011

Синхронизированный набор не всегда достаточен для безопасности потока. Он просто защищает отдельные вызовы методов.

Если вам нужно перебрать набор, вам придется добавить дополнительную синхронизацию или разобраться с исключениями ConcurrentModificationExceptions.

Наличие большого количества классов, использующих глобальный набор, увеличит вероятность мертвых блокировок.

0 голосов
/ 07 апреля 2011

Как уже упоминалось в кодере свечения, установка этого набора в контекст приложения создает проблему согласованности данных.если какие-либо обновления из нескольких потоков обращаются к applicationContext для изменения set, то CopyOnWriteArrayList или CopyOnWriteArraySet.Они создают новый список / набор обновлений, чтобы избежать исключения одновременной модификации.

CopyOnWriteArraySet .

...