mybatis_13_SqlSessionFactory的DCL单例模式
SqlSessionFactory的DCL单例模式
public class SqlSessionFactorySingleton {
private SqlSessionFactorySingleton(){
}
/**
* volatile关键字在此处的作用是:
* 1.线程的可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值;
* 2.顺序一致性:禁止指令重排序
*/
private static volatile SqlSessionFactory sqlSessionFactory = null;
public static SqlSessionFactory getInstance() throws IOException {
//双检锁/双重校验锁 DCL(double-checked locking)
if(sqlSessionFactory == null){
/**
synchronized关键字是一种同步锁,当一个线程访问对象中的synchronized同步代码块时,
其他试图访问该对象的线程将被阻塞
*/
synchronized (SqlSessionFactorySingleton.class){
if(sqlSessionFactory == null){
String resource = "mybatis-config2.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
}
return sqlSessionFactory;
}
}
创建SqlSessionFactory实例:
SqlSessionFactory sqlSessionFactory = SqlSessionFactorySingleton.getInstance();