Java中的线程安全访问枚举

时间:2019-05-31 05:41:57

标签: java enums thread-safety

我想知道以下代码可以在多线程环境线程中安全使用。我希望将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 个答案:

答案 0 :(得分:2)

使用枚举与线程安全无关。

您的代码(如问题所在所示)是线程安全的。但是以下不是:

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();
    }
}

如您所见,它是一个枚举,与线程安全无关。重要的是对象(在这种情况下为枚举值)是否具有可以在不正确同步的情况下进行更改的内部状态,以及实际代码调用的所有内容是否也都是线程安全的。