Java内存模型和volatile关键字怎么掌握
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章主要讲解了"Java内存模型和volatile关键字怎么掌握",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java内存模型和volatile关
千家信息网最后更新 2025年12月02日Java内存模型和volatile关键字怎么掌握
这篇文章主要讲解了"Java内存模型和volatile关键字怎么掌握",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java内存模型和volatile关键字怎么掌握"吧!
java内存模型(JMM):
相关概念: 1)在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 2)java的并发采用的是共享内存模型:通过读/写内存中的公共状态进行隐式通信。概念:java线程之间的通信是由java内存模型控制的,JMM决定一个线程对共享变量的写入何时对另一个线程可见。说明: 1>线程之间的共享变量存储在主内存中,每个线程都有一个私有的工作内存,工作内存中存储了该线程读/写共享变量的副本。 2>工作内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。 3>线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。 4>不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。
volatile关键字:
相关概念: 缓存行:缓存器中可以分配的最小存储单位。 L1缓存:内部缓存。 L2缓存:外部缓存。原理: 1)为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存中的数据读到缓存(L1、L2)后再进行操作,但操作完成后,处理器是不知道何时要把操作后的数据写回到内存中。 2)对volatile修饰的变量进行写操作时,JVM会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行(即JMM中的工作内存)的数据写回到系统内存中,并且将其它CPU里缓存了该内存地址的数据无效。 补充: 1>对volatile修饰的变量进行写操作(赋值)时,在JIT编译器生成的汇编指令中,我们会发现有一个以Lock为前缀的指令。 2>以Lock为前缀的指令在多核处理器下会引发了两件事情:①将当前处理器缓存行的数据写回到系统内存中 ②这个写回内存的操作会导致其它CPU里缓存了该内存地址的数据无效。 volatile的内存原语: 当读一个volatile变量时,JMM会把该线程对应的工作内存置为无效,线程接下来将从主内存中读取共享变量。 当写一个volatile变量时,JMM会把该线程对应的工作内存中的共享变量值刷新到主内存。 即: 1将本地内存中的数据设置为无效, 2从主内存中将数据复制到本地内存中, 3在本地内存中进行操作, 4操作完成后将本地内存中的数据刷新到主内存中。整体看起来就像是直接在主内存中操作一样。 说明: 用volatile修饰的变量如果被一个线程更改了,那么其它的线程都会立即感知,并且每个线程获取该变量的值都是最新的值,访问volatile修饰的变量看起来就像是直接在内存中读写一样。 特性: 可见性:对一个volatile变量的读,(任意线程)总是能看到对这个volatile变量最后的写入。 原子性:对一个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。 优点: 不会引起线程上下文的切换 volatile与synchronized的比较: 1)关键字volatile只能修饰变量,synchronized可以修饰代码块、方法 2)volatile不能保证原子性,synchronized保证原子性: volatile可以保证数据的可见性,但是不能保证原子性,所以volatile解决的是变量在多线程之间的可见性; synchronized可以保证原子性,也保证了可见性(synchronized会将私有内存和公共内存中的数据做同步),所以synchronized解决的是多线程之间访问资源的同步性。
重排序:
说明:在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。重排序分2种类型: 1)编译器重排序:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。 2)处理器重排序: 1>指令级并行的重排序:现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。 2>内存系统的重排序: 由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。JMM如何实现volatile写/读的内存语义: 1)JMM针对编译器制定的volatile重排序规则: 两个操作间重排序的条件: 1>当第一个操作是volatile读,不管第二个操作是什么,都不能重排序。这个规则确保volatile读之后的操作不会被编译器重排序到volatile读之前。 2>当第二个操作是volatile写,不管第一个操作是什么,都不能重排序。这个规则确保volatile写之前的操作不会被编译器重排序到volatile写之后。 3>当第一个操作是volatile写,第二个操作是volatile读时,不能重排序。 由以上3点可以得出结论:两个volatile变量操作不能够进行重排序。 2)为了实现volatile的内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。(内存屏障:将前面操作的共享变量值刷新到主内存中。)
感谢各位的阅读,以上就是"Java内存模型和volatile关键字怎么掌握"的内容了,经过本文的学习后,相信大家对Java内存模型和volatile关键字怎么掌握这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
内存
变量
线程
缓存
数据
处理
指令
处理器
编译
工作
模型
原子
关键
关键字
之间
编译器
保证
排序
概念
系统
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发和新媒体运营
绕过苹果验证服务器
服务器多个ip地址
数据库中计算时分秒的和
浙江调度服务器品牌
易语言数据库读取时间是
工程项目管理软件开发
延吉德高软件开发公司
卫星互联网大立科技
方舟服务器怎么进
深圳社交电商软件开发
多台电脑连接打印服务器
博兴供应链软件开发服务
网络工程和网络技术的区别
数据库服务器占用cpu高
毕业论文atm软件开发
院内设备网络安全制度
省级网络安全条例法律法规
靖江小型网络技术保养
宁夏水能耗监测软件开发
南京苏宁软件开发待遇
梁溪区信息化软件开发销售电话
搭建一个私人服务器要多少钱
财务软件开发难学吗
数据库索引会占用服务器内存吗
MYSQL数据库技术路线
浪潮服务器集成商
松江区创新软件开发服务收费
股票类的软件开发
软件开发 开源是什么意思