我有一个用例,其中迭代Java枚举并测试,该参数包含在枚举列表中,这是一个静态方法,此线程安全吗?
public enum EnumType {
ONE,
TWO,
THREE,
FOUR,
FIVE;
public static boolean isValid(String input) {
for (EnumType type : EnumType.values()) {
if (input.equals(type.toString())) {
return true;
}
}
return false;
}
}
答案 0 :(得分:4)
EnumType.values()
返回所有枚举常量的副本,因此即使您修改values()
返回的数组也不会影响任何其他线程。
字节码确认了这一点:
public static values()[Lcom/example/EnumType;
L0
LINENUMBER 43 L0
GETSTATIC com/example/EnumType.$VALUES : [Lcom/example/EnumType;
INVOKEVIRTUAL [Lcom/example/EnumType;.clone ()Ljava/lang/Object;
CHECKCAST [Lcom/example/EnumType;
ARETURN
MAXSTACK = 1
MAXLOCALS = 0
该行:
INVOKEVIRTUAL [Lcom/example/EnumType;.clone ()Ljava/lang/Object;
调用Array.clone()
方法,该方法返回数组的浅表副本
答案 1 :(得分:3)
您的方法是线程保存的,因为您没有改变任何状态,并且每次调用EnumType.values()
都会返回一个新副本,因此同时对此方法的多次调用不会相互干扰。
答案 2 :(得分:2)
isValid()
方法不会修改任何值。因为这只是一个迭代,所以您无需考虑线程安全性。每当读写同时发生时,请务必确保检查线程安全性。在这种情况下,synchronized
关键字可在需要时用于方法。但是在这种情况下,您不需要它。
答案 3 :(得分:0)
完全安全。
因为它只检查值并返回true,false。
您不必担心,因为您的方法不会访问共享实例资源或更改值。
但是,在多线程环境中,以下情况可能是有问题的:
Class IndexStore {
public static int index = -1;
}
public enum EnumType {
ONE,
TWO,
THREE,
FOUR,
FIVE;
public static boolean isValid(String input) {
for (EnumType type : EnumType.values()) {
if (input.equals(type.toString())) {
IndexStore.index = type.ordinal();
return true;
}
}
IndexStore.index = -1;
return false;
}
}