Потокобезопасный 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));

так что я думаю, что это лучшее, что ты можешь сделать.

Я бы также сохранил Setfinal как ты. Странно, что они не упоминают об этом в Javadoc.

РЕДАКТИРОВАТЬ: чтобы ответить на первый вопрос, короткий ответ да, длинный ответ, да, но вы должны заплатить цену за синхронизацию в дополнение к этому.

Другие вопросы по тегам