Java内存模型和volatile关键字怎么掌握
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要讲解了"Java内存模型和volatile关键字怎么掌握",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java内存模型和volatile关
千家信息网最后更新 2025年02月01日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安全错误
数据库的锁怎样保障安全
厂房效果图软件开发
远程服务器加密函数出错
皓龙8210cpu配什么服务器
mysql数据库增删检查
什么事数据库的安全性
教育基础数据库
舒城准轩网络技术
旧网站数据库浏览器版本
哈利波特能不能改服务器
生日歌吉他谱软件开发
数据库的数据类型
地下城堡3服务器太多怎么删除
dayz哔哩哔哩服务器
mcgs组态软件开发步骤
网吧服务器配置与管理论文
软件开发有限公司的企业使命
设计公司数据库建设
部标808服务器
cbmdisc数据库网址
数据库连接不到local
运营网络安全工程技巧
通州区管理网络技术服务介绍
t1消费系统连接数据库
数据库服务器维护方案
郑州互联网软件开发需要多少钱
苹果设置网络安全等级
oa管理软件开发定制
碳交易系统软件开发上市公司
为何自己的服务器进不了
代理服务器配置包括