При использовании синхронизированных наборов, понимайте, что вы будете подвергать временные изменения синхронизации каждому элементу в наборе. Collections.synchronizedSet()
просто обертывает ваш набор оболочкой, которая заставляет каждый метод быть синхронизированным. Наверное, не то, что вы на самом деле предназначили. A ConcurrentSkipListSet
даст вам лучшую производительность в многопоточной среде, где в поток будут записываться несколько потоков.
ConcurrentSkipListSet
позволит выполнить следующие действия:
Set newSet = s.clone();//preferably use generics
Это не редкость, чтобы использовать клон набора для обработки снимков. Если это то, что вам нужно, вы можете добавить небольшой код для обработки случая, когда элемент уже обработан. Накладные расходы, связанные со случайным объектом, включенным в более чем один набор копий, обычно меньше, чем последовательные накладные расходы при использовании Collections.concurrentSet()
.
EDIT: Я только что заметил, что ConcurrentSkipListSet является Cloneable и предоставляет метод threadafe clone()
. Я изменил свой ответ, потому что я действительно считаю, что это лучший вариант - вместо потери масштабируемости и производительности до Collections.concurrentSet()
.
Каковы условия копии? Можно ли изменить исходный набор при копировании? Что вы пытаетесь выполнить клон? (возможно, сможет предложить более эффективный способ достижения ваших целей, но вам нужно ответить на эти вопросы, чтобы убедиться, что это правильно для вас) –
@Berin Loritsch: Да, исходный набор может меняться во время копирования. Я пытаюсь получить Итератор из набора, который должен быть независим от оригинальной коллекции в смысле данных и синхронизации. – MRalwasser