在多线程中使用单例模式,java对象是有状态对象,此时线程是不安全的。
有状态对象就是有实例变量的类,可以进行赋值,可以保存数据,是非线程安全的。
无状态对象是没有实例变量的类,可以有final定义的常量,不能保存数据,是线程安全的。
有状态对象:
public class ReportTask {
private Task task;
public void doExcute(String message) {
task = TaskHolder.getTask(message);
if (task == null) {
LOGGER.info("task[{}]不存在,请检查配置是否正确",message);
}
task.execute();
}
}
以下是改为无状态对象:
public class ReportTask {
public void doExcute(String message) {
Task task = TaskHolder.getTask(message);
if (task == null) {
LOGGER.info("task[{}]不存在,请检查配置是否正确",message);
}
task.execute();
}
}