1

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

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

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

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

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

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

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

谢谢!

4

3 回答 3

4

每个枚举值都是一个单例。加载枚举类的类加载器只存在一个实例。所以是的,如果两个线程使用枚举值作为锁,它们将使用相同的锁,从而相互阻塞。

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

于 2012-05-02T10:51:29.673 回答
3

只有一个Category.A实例,所以所有实例synchronized(Category.A)都会互相阻挡,这就是你对你的集合所做的事情。

您可以使用与您的枚举关联的私有最终EnumMap,用 s 填充它new Object(),确保您不修改映射,并使用与类别关联的对象作为该类别的锁定。这样你就可以确定锁只用于那段代码。

于 2012-05-02T10:51:45.940 回答
0

您的枚举将在您的项目(包)中可见。如果您需要在其他地方使用此逻辑,则需要添加对该项目的引用。

于 2012-05-02T10:50:20.050 回答