[英]Java Enum static method thread safety?
我有一個用例,迭代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;
}
}
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()
方法,該方法返回數組的淺表副本
您的方法是線程保存,因為您沒有改變任何狀態,並且每次調用EnumType.values()
返回一個新副本,因此同時對此方法的多次調用不會相互干擾。
isValid()
方法不會修改任何值。 因為它只是一個迭代,所以您不需要考慮線程安全性。 每當寫入和讀取同時發生時,務必確保檢查線程安全性。 在這種情況下,只要需要, synchronized
關鍵字就可以用於方法。 但在這種情況下,你不需要它。
萬無一失。
因為它只是檢查值並返回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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.