1. JMM
- 通过JMM来实现和主内存之间的抽象关系。
- 屏蔽各个硬件平台和操作系统的内存访问差异以实现让Java程序在各种平台下都能达到一致的内存访问效果。
三大特性: - 原子性:互斥,同时成功或失败。
- 有序性:指令重排序后有序。
- 可见性:当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道该变更,JMM规定了所有变量都存储在主内存中。
线程拷贝共享变量的副本,进行操作,然后再写入主内存。
本线程的共享变量是私有的。要进行不同线程之间的数据读取,需要通过主内存进行中转
2. 脏读
线程A修改了数据x,但还没有写回主内存,线程B读取了主内存中的x。
3. 多线程读取过程
JMM控制实现线程修改变量的通知。
4. 多线程先行发生原则之happens-before
在JMM中,如果一个操作执行的结果需要对另一个操作可见或者代码重排序,那么这两个操作之间必须存在happens-before(先行发生原则)。逻辑上的先后关系。
总原则:
- 如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。
- 两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。如果重排序之后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法。
8条规则: -
- 次序规则:一个线程内,按照代码顺序,写在前面的操作先行发生于写在后面的操作。
-
- 锁定规则:一个unLock操作先行发生于Lock操作。
-
- volatile变量规则:对一个volatile变量的写操作先行发生于后面对这个变量的读操作。
-
- 传递规则。
-
- 线程启动规则
-
- 线程中断规则
-
- 线程终止规则
-
- 对象终结规则