【问题标题】:Thread-safe Enumset in JavaJava 中的线程安全枚举集
【发布时间】:2014-08-13 18:44:07
【问题描述】:

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

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

我有两个问题:

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

【问题讨论】:

  • 对我来说看起来不错。 Collections.synchronizedSet 只是一个包装器,不会更改或替换 EnumSet。
  • 我刚刚检查了源代码 - 实际上它只是一个添加基于互斥锁的同步的包装器。而且似乎没有任何库提供任何(更具可读性)的单行代码。

标签: java multithreading enumset


【解决方案1】:

好吧来自javadoc

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

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

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

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

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

【讨论】:

  • 谢谢,我检查了EnumSetCollections 的javadoc,但没有找到答案。但是,检查源代码给出了第一个问题的答案。关于第二个 - 我希望 Guava 提供这样的方法,但似乎没有。
猜你喜欢
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多