java - Java 中的线程安全访问枚举

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

最佳答案

使用枚举与线程安全关系不大。

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

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

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

关于java - Java 中的线程安全访问枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56389265/

相关文章:

java - 通用返回类型上限 - 接口(interface)与类 - 令人惊讶的有效代码

java - 在Kotlin中结合反射、枚举和泛型,类型推断失败,但我也不知道

objective-c - 哪个是线程安全的原子或非原子?

java - 如何创建具有公共(public)属性的枚举组

java System.out 丢失

java - Android Activity会关闭Looper&Handler吗?

JavaFX : can controller be an abstract class?

java - 让 JSoup 报告 HTML 无效的原因

java - 为什么我的 JRadioButtons 标签是 "..."而不是我想要的文本?

java - 我应该如何设计具有继承的枚举?