Потокобезопасный доступ к перечислениям в Java - PullRequest
0 голосов
/ 31 мая 2019

Я хочу знать, что следующий код может безопасно использоваться в многопоточной среде потока. Я надеюсь использовать класс Task в качестве слоя доступа.

public class Task {
    public static enum TaskList {

        TASK_A {

            @Override
            void doProcess() {
                System.out.println("processing task A");

            }
        },
        TASK_B {
            @Override
            void doProcess() {
                System.out.println("processing task B");

            }
        },
        TASK_C {
            @Override
            void doProcess() {
                System.out.println("processing task C");
            }
        };

        abstract void doProcess();
    }
}

Вот как это будет использоваться.

public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
                //following code will be executed in multiple threads.

                Task.TaskList task = Task.TaskList.TASK_A;
                task.doProcess();

            }
        });
        thread.start();
    }

1 Ответ

2 голосов
/ 31 мая 2019

Использование перечислений имеет мало общего с безопасностью потоков.

Ваш код (как представлено здесь в вопросе) является потокобезопасным.Но следующее не так:

public class Task {
    public static enum TaskList {

        TASK_A {
            int x = 0;

            @Override
            void doProcess() {
                x++;
                System.out.println("processing task A: " + x);

            }
        };

        abstract void doProcess();
    }
}

Как видите, это перечисление не имеет отношения к безопасности потока.Важно то, имеет ли объект (в данном случае значение enum) какое-либо внутреннее состояние, которое может измениться без надлежащей синхронизации, и все ли, что вызывает реальный код, также является поточно-ориентированным.

...