ErrorContext
ErrorContext的这种写法是为了维护每个线程中都有且只有一个ErrorContext类
public class ErrorContext {
// ThreadLocal对象,保证线程间数据互相隔离
private static final ThreadLocal<ErrorContext> LOCAL = new ThreadLocal<ErrorContext>();
// 私有化构造函数,不允许外部类创建其实例对象
private ErrorContext() {
}
// 获取实例化对象的方法
public static ErrorContext instance() {
ErrorContext context = LOCAL.get();
if (context == null) {
context = new ErrorContext();
LOCAL.set(context);
}
return context;
}
}
测试代码
public class ErrorContextTest {
// ThreadLocal对象,保证线程间数据互相隔离
private static final ThreadLocal<ErrorContextTest> LOCAL = new ThreadLocal<ErrorContextTest>();
// 私有化构造函数,不允许外部类创建其实例对象
private ErrorContextTest() {
}
// 获取实例化对象的方法
public static ErrorContextTest instance() {
ErrorContextTest context = LOCAL.get();
if (context == null) {
context = new ErrorContextTest();
LOCAL.set(context);
}
return context;
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
Thread thread = new Thread() {
@Override
public void run() {
System.out.println(ErrorContextTest.instance());
System.out.println(ErrorContextTest.instance());
}
};
thread.start();
}
}
}
测试数据
cn.kgm.controller.ErrorContextTest@442d2736
cn.kgm.controller.ErrorContextTest@330d92a
cn.kgm.controller.ErrorContextTest@563fde08
cn.kgm.controller.ErrorContextTest@490e6b80
cn.kgm.controller.ErrorContextTest@4c844427
cn.kgm.controller.ErrorContextTest@490e6b80
cn.kgm.controller.ErrorContextTest@563fde08
cn.kgm.controller.ErrorContextTest@330d92a
cn.kgm.controller.ErrorContextTest@442d2736
cn.kgm.controller.ErrorContextTest@4c844427
结论:
每个线程中都能创建新的ErrorContextTest类,但是各个线程之间的ErrorContextTest类互相隔离,重复获取实例对象时,返回的是同一对象