java内存模型

参考大佬的文章,整理一下java内存模型笔记。
原文链接:https://blog.csdn.net/Java_3y/article/details/121347976

1.为什么存在java内存模型?

java为了屏蔽硬件和操作系统访问内存的各种差异,提出了内存模型的规范,保证java程序在各个平台下对内存的访问都能有一致的效果。它是一种规范,java虚拟机来实现这个规范。
主要有以下几块:
Java内存模型的抽象结构
happen-before规则
对volatile内存语义的探讨

2.java内存模型抽象结构?

定义了java线程对内存数据进行交互的规范。
线程之间的共享变量存储在主内存中,每个线程有自己私有的本地内存,本地内存存储了该线程读/写共享变量的副本。本地内存是java内存模型的抽象概念,并不是真实存在。
java内存模型规定线程对变量的所有操作都必须在本地内存中进行,不能直接读/写主内存的变量;
定义了8种操作来完成变量如何从主内存到本地内存,如何从本地内存到主内存;
分别是:read/load/use/assign/store/write/lock/unlock操作。对变量的一次读写就涵盖了这些操作,如下图:

3.happen-before规则?

happen-before是一套规则,目的是为了阐述操作之间的内存可见性。
CPU和编译器都能指令重排,虽然指令重排能提高运行效率,但在并发编程中在兼顾效率的前提下,还希望程序结果能由我们掌控,就要求在某些场景下,对一组操作不能进行重排序,就是前一个操作的结果对后续操作必须是可见的。
所以提出的8条规则:
程序次序原则(Program Order Rule):在一个线程内,按照控制流顺序,书写在前面的操作先行发生于书写在后面的操作;
管成锁定原则(Monitor Lock Rule):一个unlock操作先行发生于后面对同一个锁的lock操作。这里必须强调的是“同一个锁”,而“后面”指的是时间上的先后顺序;
volatile变量规则(Volatile Variale Rule):对于一个volatile变量的写操作先行发生于这个变量的读操作,这里的“后面”同样是指时间上的先后;
线程启动规则(Thread Start Rule):Thread对象是start()方法先行发生于此线程的每一个动作;
线程终止规则(Thread Termination Rule):线程中的所有操作都先行发生于对此线程的中止检测;当一个线程结束时,会把自己所有操作的结果都同步到主内存。而任何其它线程当发现这个线程已经执行结束了,就会从主内存中重新刷新最新的变量值。所以结束的线程A对共享变量的修改,对于其它检测了A线程是否结束的线程是可见的;
线程中断规则(Thread Interruuption Rule):对线程的interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread::interrupt()检测到是否有中断发生;
对象终结规则(Finalizer Rule):一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始;
传递性(Transitivity):如果操作A先行发生于操作B,操作B先行发生于操作C,那么就可以得出操作A先行发生于操作C的结论。该规则是建立在前面7条规则基础上,满足任意一条即可使用。

4.volatile关键字?

它的主要特性:可见性、有序性(禁止重排序)。
java内存模型中为了实现这2个特性,定义了4种内存屏障的规范:LoadLoad/LoadStore/StoreLoad/StoreStore
就是在volatile的前后加上内存屏障,使编译器和CPU无法重排序,致使有序,并且写volatile变量对其他线程可见。
从汇编层面上来看,它通过lock前缀指令来实现,lock指令能保证:禁止CPU和编译器重排序(保证有序性),保证CPU写核心指令可以立即生效且其他核心的缓存数据失效(保证可见性)。

5.volatile和MESI协议是啥关系?

它们没有直接关联。
java内存模型关注的是编程语言层面上,是高维度的抽象;
MESI是CPU缓存一致性协议,不同的CPU架构都不一样,可能有的CPU压根都没有用MESI协议。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值