Java中的线程安全枚举集



我使用以下代码初始化一个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:回答第一个问题,简短的答案是肯定的,长答案是肯定的,但是你必须为同步付出代价。

相关内容

  • 没有找到相关文章

最新更新