谈谈Java内存模型(JMM)以及对volatile关键字的理解

Java面试题目录

注意Java内存模型JMM与JVM内存模型不是一个东西。

Java内存模型(JMM)

Java内存模式是一种虚拟机规范,Java内存模型规定线程之间的共享变量必须存储在主内存中。每个线程都有自己的工作内存,线程的工作内存保存了该线程用到的变量和主内存的副本拷贝,线程对变量的操作都在工作内存中进行。线程不能直接读写主内存中的变量。

不同的线程之间也无法访问对方工作内存中的变量。线程之间变量值的传递均需要通过主内存来完成。

Happens-before 原则(先行发生)

1)如果一个操作 Happens-before 另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。

2)两个操作之间存在 Happens-before 关系,并不意味着 Java 平台的具体实现必须要按照 Happens-before 关系指定的顺序来执行。如果重排序之后的执行结果,与按 Happens-before 关系来执行的结果一致,那么这种重排序并不非法(也就是说,JMM 允许这种重排序)

as-if-serial

不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。

volatile关键字

volatile 关键字可以保证变量的可见性,线程每次使用它都到主存中进行读取。对这个变量进行读写操作的时候,会通过插入特定的 内存屏障 的方式来禁止指令重排序。

相关推荐
basketball61619 分钟前
C++ 中的 ptrdiff_t 详解
开发语言·c++
极光代码工作室27 分钟前
基于SpringBoot的校园论坛系统
java·springboot·web开发·后端开发
月亮邮递员61635 分钟前
Markdown语法总结
开发语言·前端·javascript
printfLILEI35 分钟前
php中的类与对象以及反序列化
linux·开发语言·php
曹牧36 分钟前
C#:主线程能够捕获到子线程中的异常
开发语言·数据库·c#
代码中介商37 分钟前
深入解析STL中的stack、queue与priority_queue
开发语言·c++
XS03010640 分钟前
Spring Bean 作用域 & 生命周期
java·后端·spring
NagatoYukee41 分钟前
Spring Security基础部分学习
java·学习·spring
彦为君41 分钟前
JavaSE-07-异常机制
java·开发语言·后端·python·spring
OxyTheCrack1 小时前
【Golang】简述make与new内置函数以及两者的区别
开发语言·golang