我使用以下代码来初始化 EnumSet 的同步实例:
private final Set<MyClass> instance = Collections.synchronizedSet(EnumSet.noneOf(MyClass.class));
我有两个问题:
- 在这种情况下,我是否保留了 EnumSet 的所有优点,例如紧凑性和效率?
- 是否有更多...比方说...语义丰富的方法来获取 EnumSet 的空且同步的实例?
我使用以下代码来初始化 EnumSet 的同步实例:
private final Set<MyClass> instance = Collections.synchronizedSet(EnumSet.noneOf(MyClass.class));
我有两个问题:
来自javadoc:
如果多个线程同时访问一个枚举集,并且至少有一个线程修改了该集,则它应该在外部同步。这通常是通过同步一些自然封装枚举集的对象来完成的。如果不存在这样的对象,则应使用 Collections.synchronizedSet(java.util.Set) 方法“包装”该集合。这最好在创建时完成,以防止意外的不同步访问:
Set s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));
所以我认为这是你能做的最好的。
我也会Set
final
像你一样保留。奇怪的是他们没有在 javadoc 中提到它。
编辑:回答第一个问题,简短回答是,长回答,是的,但您必须为此付出同步的代价。