При использовании синхронизированных наборов, имейте в виду, что вы будете подвергаться синхронизации при доступе к каждому элементу в наборе. Collections.synchronizedSet()
просто оборачивает ваш набор оболочкой, которая заставляет синхронизировать каждый метод. Вероятно, не то, что вы действительно хотели. A ConcurrentSkipListSet
даст вам лучшую производительность в многопоточной среде, где несколько потоков будут записывать в набор.
ConcurrentSkipListSet
позволит вам выполнить следующее:
Set newSet = s.clone();//preferably use generics
Нередко используется клон набора для обработки снимков. Если это то, что вам нужно, вы можете добавить небольшой код для обработки случая, когда элемент уже обработан. Накладные расходы, связанные со случайным объектом, включенным в более чем один набор копий, обычно меньше согласованных накладных расходов при использовании Collections.concurrentSet()
.
РЕДАКТИРОВАТЬ: Я только что заметил, что ConcurrentSkipListSet является Cloneable и обеспечивает потокобезопасный метод clone()
. Я изменил свой ответ, потому что я действительно считаю, что это лучший вариант - вместо потери масштабируемости и производительности до Collections.concurrentSet()
.