我想知道下面的代码可以在多线程环境线程中安全地使用。我希望使用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/