3

我使用以下代码来初始化 EnumSet 的同步实例:

private final Set<MyClass> instance = Collections.synchronizedSet(EnumSet.noneOf(MyClass.class));

我有两个问题:

  • 在这种情况下,我是否保留了 EnumSet 的所有优点,例如紧凑性和效率?
  • 是否有更多...比方说...语义丰富的方法来获取 EnumSet 的空且同步的实例?
4

1 回答 1

8

来自javadoc

如果多个线程同时访问一个枚举集,并且至少有一个线程修改了该集,则它应该在外部同步。这通常是通过同步一些自然封装枚举集的对象来完成的。如果不存在这样的对象,则应使用 Collections.synchronizedSet(java.util.Set) 方法“包装”该集合。这最好在创建时完成,以防止意外的不同步访问:

Set s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));

所以我认为这是你能做的最好的。

我也会Set final像你一样保留。奇怪的是他们没有在 javadoc 中提到它。

编辑:回答第一个问题,简短回答是,长回答,是的,但您必须为此付出同步的代价。

于 2014-06-23T16:29:18.823 回答