(六)JUC - java内存模型 JMM

 

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操作

3volatile变量规则

前面的写对后面(时间先后)的读是可见的。

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案例分析:

分析:

解决:

1synchronized

 

2volatile