Mybatis源码解析 第四章 ErrorContext

92 阅读1分钟

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类互相隔离,重复获取实例对象时,返回的是同一对象