我想知道以下代码可以在多线程环境线程中安全使用。我希望将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();
}
答案 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();
}
}
如您所见,它是一个枚举,与线程安全无关。重要的是对象(在这种情况下为枚举值)是否具有可以在不正确同步的情况下进行更改的内部状态,以及实际代码调用的所有内容是否也都是线程安全的。