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

对Java枚举值的引用是全局的吗?,java,enums,synchronization,locking,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

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

public enum Category {
  A, B, C, D;
}
并希望创建一个锁定机制,以便我们一次只处理每个类别的一个项目。我的第一个想法是这样做:

Set categories = new HashSet();
for (Category cat : Category.values() {
  categories.put(cat);
}
然后,当我需要获取锁时,我会执行以下操作:

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


谢谢

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

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

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

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

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

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

只有一个类别。一个实例,因此所有synchronizedCategory.A都将相互阻止,这就是您对集合所做的操作

可以使用与枚举关联的私有final,用新对象填充它,确保不修改映射,并使用与类别关联的对象作为该类别的锁。这样,您就可以确保锁只在该代码段中使用。

只有一个类别。一个实例,因此所有synchronizedCategory.A都将相互阻止,这就是您正在对集合执行的操作


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

我认为您没有使用正确的词汇来提出问题。问一下所有的参考文献都是全球性的,这真的没有意义?此外,没有Setget方法,如果已经获得了对该类别的引用,则根本不需要set。我认为您的问题有缺陷,您的代码无法编译。你能澄清/澄清你的问题吗?我认为你没有用正确的词汇提出你的问题。问一下所有的参考文献都是全球性的,这真的没有意义?此外,没有Setget方法,如果已经获得了对该类别的引用,则根本不需要set。我认为您的问题有缺陷,您的代码无法编译。你能澄清/澄清你的问题吗?我不认为这是OP的要求。我不认为这是OP的要求。