发一下happens-before 原则和内存加载的8个理论,并谈谈你的理解
来源:1-2 课程导学
![](http://img1.sycdn.imooc.com/user/55b2263a000117fe01000100-100-100.jpg)
蓝天白云0
2019-07-18
3回答
-
你好,先说happens-before:
程序次序原则: 在一个线程内,代码按照顺序执行
管程锁定规则: 在同一个monitor上,unlock操作时间上先行发生于后面的lock操作
volatile变量规则: 对一个volatile变量的写操作先于读操作
线程启动原则: Thread的start()先于该线程的任何操作
线程终止原则: Thread的所有操作都先于线程的终止检测。可以通过Thread.join()和Thread.isAlive()的返回值检测线程是否已终止
线程终断规则: 线程的interrupt()方法先于中断线程检测到中断事件的发生,即可以使用interrupted()方法检测到线程是否被中断了。
对象终结原则: 对象构造函数执行完毕先于finilized()方法
传递性: A先于B,B先于C。可以推断出A先于C012019-07-21 -
Jimin
2019-07-18
其实,这些都是jmm的概念,概念其实字面上都说的很清楚了,对于我们而言其实很难直接使用到,但是jvm提供给我们的类和关键字却是必须要遵守这些原则的。拿synchronized来举个例子,他可以自动加锁和解锁,但是他在实现时就必须满足:unlock操作时间上先行发生于后面的lock操作,意思就是要先lock再unlock,不能先做unlock再做lock;再举个例子,在一个线程内,代码按照顺序执行,这个其实也很表面,代码不能随意跳着执行,我们分析代码执行时按照代码顺序去分析就可以,不存在不按顺序的可能,当然也需要注意,这里说的是一个线程内,多个线程是存在交替执行的。
jmm这些规定其实根本上是约定了jvm提供一些关键字的基本行为,也为我们分析java执行,尤其是多线程环境下的执行,提供了理论依据。也因此,java里synchronized、volatile等关键字会有自己的特性,其他封装的类能完成的功能也是基于这些关键字基础特性的稳定才能正常体现出来。00 -
Jimin
2019-07-18
再说一下内存交互的操作:
1.lock 将主内存的变量锁住。
2.unlock 主内存的变量解锁,其他线程可以获取这个变量
3.read 把主内存的变量读到写到工作内存里面
4.load 把read读取到的值存在本地的副本里面
5.usage 把本地变量的副本交给cpu执行
6.assign 把返回的结果复制给本地副本
7.store 把本地副本的值写到主内存
8.write 把主内存的值复制给主内存的变量
那么从jvm的层面来说就可以通过read和store这两个原子操作来保证内存可见性。就是读之前必须先执行read和load操作,写之后必须先执行store和write。
也就是所有的写必须happens-before读。00
相似问题