繁体   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