1. 计算机硬件存储体系 和 JMM 的关系
2. Java内存模型 Java Memory Model
3. JMM 三大特性:
1)可见性
线程脏读
2)原子性
3)有序性
指令重排序
4. 多线程对变量的读写过程
线程脏读
5. 多线程先行发生原则 happens-before (8条)
总原则:
案例说明:
8条原则:
1)次序规则
一个线程内,按照代码顺序,写于前面的操作先行发生于写于后面的操作。
加深说明:前一个操作的结果可以被后一个操作获取。
eg: 前面一个操作把变量x赋值为1,后面一个操作肯定知道x已经变成了1。
2)锁定规则
一个unlock操作先行发生于后面(时间先后)对同一把锁的lock操作
3)volatile变量规则
前面的写对后面(时间先后)的读是可见的。
4)传递规则
操作A先行发生于操作B,操作B先行发生于操作C => 操作A先行发生于操作C
5)线程启动规则(Thread Start Rule)
Thread.start() 方法先行发生于此线程的每一个动作
6)线程中断规则(Thread Interruption Rule)
通过Thread.interrupt()检测是否发生中断;
eg: 你要先调用interrupt()方法设置中断标志位,我才能检测到中断发生。
7)线程终止规则(Thread Termination Rule)
线程中的所有操作都先行于对此线程的终止检测。
通过isAlive()检测线程是否已经终止执行。
8)对象终结规则(Finalizer Rule)
一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始。 “新=>旧”
对象没有完成初始化之前,是不能调用finalize()方法的。
(finalize()的目的:在对象被不可撤销的丢弃之前执行清理操作。)
happens-before 小总结:
happens-before案例分析:
分析:
解决:
1)synchronized
2)volatile