java - 对 Java 枚举值的引用是全局的吗?

标签 java enums synchronization locking

假设我有一个包含多个值的枚举,例如:

public enum Category {
  A, B, C, D;
}

并且想创建一个锁定机制,以便我们一次只能处理每个类别的一个项目。我的第一个想法是做这样的事情:

Set categories = new HashSet();
for (Category cat : Category.values() {
  categories.put(cat);
}

然后当我需要获取锁时,我会执行以下操作:

synchronized(categories.get(category)) {
  ....
}

这会起作用吗,或者所有对枚举值的引用都是全局的,所以如果其他线程在其他地方做了同样的事情,它们会互相阻塞吗?

谢谢!

最佳答案

每个枚举值都是一个 singleton . classloader 仅存在一个实例它加载了枚举类。所以是的,如果两个线程使用枚举值作为锁,它们将使用相同的锁并因此互相阻塞。

旁注:如果您使用有效的编译 Java 代码,您的问题会更清楚。

关于java - 对 Java 枚举值的引用是全局的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10412208/

相关文章:

video - 音视频同步,TS MPEG2;H264/AVC,理解Handbrake中的PTS

java - 查找公钥的长度

java - JFrame 不更新其内容

javascript - 方法链接会在堆栈中创建中间变量吗?

java - 有没有办法在java(或scala)信号量对象中​​包含条件来获取方法?

c# - 为什么Form.Close要等待MessageBox.Show?

java - 在 Maven 中查找定义了属性的位置

Java:如何将 String ArrayList 分配给 List<Enum>

java - 使用 Java 在 SQLite 中存储和检索枚举

.net - 从ListBox SelectedItems属性检索枚举