簡體   English   中英

Java Enum靜態方法線程安全嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM