Java Enum статический метод безопасности потока? - PullRequest
4 голосов
/ 03 апреля 2019

У меня есть сценарий использования, в котором при переборе перечисления и проверки 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;
    }
}

Ответы [ 4 ]

4 голосов
/ 03 апреля 2019

EnumType.values() возвращает копию всех констант enum, поэтому, даже если вы измените массив, возвращенный 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(), который возвращает поверхностную копию массива

3 голосов
/ 03 апреля 2019

Ваш метод сохраняет потоки, поскольку вы не изменяете никакое состояние, и каждый вызов EnumType.values() возвращает новую копию, поэтому множественные вызовы этого метода одновременно не мешают друг другу.

2 голосов
/ 03 апреля 2019

Метод isValid() не изменяет ни одно из значений.Поскольку это всего лишь итерация, вам не нужно думать о безопасности потоков.Всегда проверяйте безопасность потоков, когда запись и чтение происходят одновременно.В таких случаях synchronized ключевое слово может использоваться для методов всякий раз, когда требуется.Но в этом случае вам это не нужно.

0 голосов
/ 03 апреля 2019

Совершенно безопасно.
Потому что он просто проверяет значение и возвращает 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...