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

相关推荐
胖咕噜的稞达鸭32 分钟前
自定义shell命令行解释器自制
java·开发语言
草莓熊Lotso33 分钟前
Git 分支管理:从基础操作到协作流程(本地篇)
大数据·服务器·开发语言·c++·人工智能·git·sql
报错小能手35 分钟前
C++异常处理 终极及总结
开发语言·c++
q***33374 小时前
oracle 12c查看执行过的sql及当前正在执行的sql
java·sql·oracle
tobebetter95276 小时前
How to manage python versions on windows
开发语言·windows·python
Y***h1877 小时前
第二章 Spring中的Bean
java·后端·spring
9***P3347 小时前
PHP代码覆盖率
开发语言·php·代码覆盖率
8***29317 小时前
解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域
java·前端·spring
CoderYanger7 小时前
优选算法-栈:67.基本计算器Ⅱ
java·开发语言·算法·leetcode·职场和发展·1024程序员节
jllllyuz7 小时前
Matlab实现基于Matrix Pencil算法实现声源信号角度和时间估计
开发语言·算法·matlab