Потокобезопасный Enumset в Java
Я использую следующий код для инициализации синхронизированного экземпляра EnumSet:
private final Set<MyClass> instance = Collections.synchronizedSet(EnumSet.noneOf(MyClass.class));
У меня есть два вопроса:
- сохранить ли в этом случае все преимущества EnumSet, такие как компактность и эффективность?
- Есть ли более... давайте... семантически богатый способ получить пустой и синхронизированный экземпляр EnumSet?
1 ответ
Ну из ага
Если несколько потоков обращаются к набору enum одновременно, и хотя бы один из потоков изменяет набор, он должен быть синхронизирован извне. Обычно это достигается путем синхронизации с некоторым объектом, который естественным образом инкапсулирует набор перечислений. Если такого объекта не существует, набор следует "обернуть" с помощью метода Collections.synchronizedSet(java.util.Set). Это лучше всего делать во время создания, чтобы предотвратить случайный несинхронизированный доступ:
Set s = Collections.synchronizedSet (EnumSet.noneOf (MyEnum.class));
так что я думаю, что это лучшее, что ты можешь сделать.
Я бы также сохранил Set
final
как ты. Странно, что они не упоминают об этом в Javadoc.
РЕДАКТИРОВАТЬ: чтобы ответить на первый вопрос, короткий ответ да, длинный ответ, да, но вы должны заплатить цену за синхронизацию в дополнение к этому.