假设我有一个包含多个值的枚举,例如:
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/