.
错误的作用域会出现并发问题
SqlSessionFactoryBuilder
建造者模式,一旦用此创建了SqlSessionFactory,便不再需要它了
因此它应该作为局部变量
SqlSessionFactory
类似于数据库连接池,一旦被创建就应该在程序运行期间一直存在,并且应该只有一个实例
应该使用单例模式
SqlSession
SqlSession实例不是线程安全的,因此不能被共享
应该在每个方法中创建一个实例,方法结束后就
close()
.
错误的作用域会出现并发问题
SqlSessionFactoryBuilder
建造者模式,一旦用此创建了SqlSessionFactory,便不再需要它了
因此它应该作为局部变量
SqlSessionFactory
类似于数据库连接池,一旦被创建就应该在程序运行期间一直存在,并且应该只有一个实例
应该使用单例模式
SqlSession
SqlSession实例不是线程安全的,因此不能被共享
应该在每个方法中创建一个实例,方法结束后就close()
脏读 Dirty read | 不可重复读 Non repeatable read | 幻读 Phantom read | |
---|---|---|---|
读未提交 Read uncommited | √ | √ | × |
读已提交 Read commited | × | √ | × |
可重复读 Repeatable read | × | × | √ |
穿行 Serializable | × | × | × |
1 | private static void quickSort(int[] nums){ |
1 | @SuppressWarnings("FieldMayBeFinal") |
【加载】JVM把.class文件加载到方法区,生成构造函数、接口、静态变量(static)、常量(final)池、静态代码块
并在堆中生成对应的Class对象
【链接】将类的二进制代码合并到JVM的运行状态之中
• 验证
确保加载的类信息符合JVM规范,没有安全方面的问题
• 准备
正式为static变量分配内存并设置默认值(和Bean实例化很像),具体赋值在初始化阶段完成
• 解析
虚拟机常量池内的符号引用替换为直接引用(地址引用)的过程
【初始化】如果发现其父类还没有进行过初始化,则需要先初始化其父类
顺序如下(其实很有规律)
1、父类的静态变量
2、父类的静态代码块
3、子类的静态变量
4、子类的静态代码块
5、父类的非静态变量
6、父类的非静态代码块
7、父类的构造方法
8、子类的非静态变量
9、子类的非静态代码块
10、子类的构造方法
.
自定义ClassLoader→AppClassLoader(自定义的类)→PlatformClassLoader(jre/lib/ext/*.jar)→BootClassLoader(jre/lib/rt.jar)
.
.
PC计数器、本地方法栈、栈为线程私有,堆、元空间为线程共享
关于常量池:
文章 https://mp.weixin.qq.com/s/DZkGRTan2qSzJoDAx7QJag 的学习笔记
相比synchronized关键字,volatile更轻量
以上效果是利用CPU的内存屏障实现的