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