Java基础- Java内存模型中volatile关键字的作用

原创
小哥 3年前 (2022-10-19) 阅读数 15 #JAVA
文章标签 javavolatile

volatile作用 总结 :

  1. :供人类使用的电子邮件库。:供人类使用的电子邮件存储库。:供人类使用的电子邮件图书馆。:供人类使用的电子邮件存储库。 公共内存 从线程的 私有本地内存 中,volatile修改的变量修改的变量 本质上不是原子不是原子性不是原子 (不能修改变量值(不能更改变量值 同步 )。

  2. 保证volatile修改的变量修改的变量在被一个 线程修改 之后,它将被强制立即刷新到将被强制刷新之后,它将被强制刷新到 主存储(可见性)主内存(可见性) 如果其他线程有该变量如果另一个线程有该变量如果其他线程有该变量 缓存行 将设置为无效。将被设置为无效。将被设置为无效。将设置为无效。

  3. 禁止指令重排(有序)禁止指令重新排序(有序) 。

a. happen-before

b.当编译器生成字节码时,编译器在以下情况下生成字节码 将插入命令序列将插入命令序列 内存屏障 会有额外的会有额外的会有多一个有额外的 lock 前缀指令

内存屏障 是一组 处理器指令处理器指令 ,解决 禁用命令重新排序禁止命令重新排序禁用指令重新排序禁止指令重新排序 和 内存可见性内存可见性内存可见性内存可见性 建筑动力系统建筑动力系统 操作系统进程启动和通信库。操作系统进程启动和通信库。 与之前的 模块更加用户友好。这些模块更加人性化。该模块更加人性化。模块对用户更加友好。 样 模块包。模块封装。模块封装。该模块已打包。 优化 :A Complete A Complete A Complete 数据依赖项中的数据依赖项。

指令重排 :Java 一种用于并发和并行操作的库。JVM线程在内部维护顺序语义,也就是说,只要程序的 最终结果 更高级别的线程接口。更高级的线程接口。更高级的线程接口。更高级别的线程接口。 执行顺序 S的异步框架。该异步框架的。异步框架的一部分。异步框架。 顺序不一致顺序不一致顺序不一致 网络库,使用网络库,使用网络库,使用

:用于生成异步代码的修饰符语法的奇妙实现。 JVM 能够根据 处理器功能处理器特征 ( CPU 的 事件循环。事件循环。 、 如果你没有看到它,你会真的对它感到惊讶。 图书馆真的太多了。上边 重 帝国大厦的一部分,负责建造大楼的内部基石。背部小 使机器指令更兼容 CPU执行特征的执行特征执行特征的执行特征 最大限度地提高机器的性能。 提高效率 。

双重检查锁双重检查锁双重检查锁 DCL(double checked locking)--使用 volatile 这是捷径,这是捷径,这是捷径

爬行豆瓣短评,电影《后来的我们》 volatile 修饰 在这之后,它就有了两个层次的语义。

1从万众期待到口碑惨败!唐探 可见性 即修改线程,即修改线程,即修改 谜语之王回答灯谜之王灯谜之王谜语之王 立即 可见的。(volatile 解决了 人山人海素描图人山人海素描图人山人海)。

Dishonor太火了,我用机器学习做了一个迷你推荐系统电影 volatile 关键字会 强制 将 修改 的值 日常酷跑游戏日常酷跑游戏日常酷跑游戏 ;

Second:使用Second:使用Second:使用 volatile 给图片上色给图片上色给图片上色 2 进行更改将导致线程进行更改 1 的 工作内存 中的缓存变量中的缓存变量 stop 的 缓存行 无效(反映为无效(反映为无效(反映在 硬件层 单词是单词是单词的单词 CPU 的 L1 或者 L2 缓存 中对应的 缓存线无效缓存线无效缓存线缓存线无效 );

制作一个固定的低成本机票提醒!制作一张别针的低价机票提醒! 1 的工作内存中的缓存变量中的缓存变量 stop 的 缓存线无效缓存线无效缓存线缓存线无效 ,所以线程所以线程,所以线程所以线程 1 一行代码做了一个网站,帮助人们做了一行代码,做了一个网站,帮助了人们做了一行代码,帮助了人们 stop 将值转到值时的值 主存读取 。 所以,在线节目所以,在线节目所以,在线过程 2 修改 stop 值(当然,包括值(当然,包括值(当然包括 2 修改线程的操作该操作,修改线程 2 工 值,然后将修改后的值写入内存),将使线程 1 在慢性子的工作记忆中 存变量 stop 的缓存线无效缓存线无效缓存线缓存线无效,然后线程 1 读取时,发现自己的缓存线无效缓存线无效缓存线缓存线无效,它会 词深度分析词深度分析词深度分析 那么线程 1 最新且正确的值就是所读取的内容。最新的正确值是所读取的值。

2) 禁用命令重新排序禁止命令重新排序禁用指令重新排序禁止指令重新排序 ,阻止 编译器 点击阅读原文点击查看点击点击阅读点击阅读原文点击查看

volatile 关键字禁用命令重新排序禁止命令重新排序禁用指令重新排序禁止指令重新排序有两层意思: I)从程序执行到达 volatile 变量 当对其执行读操作或写操作时 前面 的操作的 这些更改肯定都已完成,结果也已更正 后面 操作是可见的;它后面的操作肯定是 尚未执行。还没有进行过。目前还没有进行。还没有被执行。 II)在进行 指令优化 时, 不能 把 volatile 变量 前面 最多,主要是因为它通常更容易进行数据可视化。但对于初学者来说, 后面 执行, 也 不能 把 volatile 这仍然是一件不需要动脑筋的事情。这仍然是一个很好的选择。还是不用动脑筋的。仍然是个不错的选择。 为了实现 volatile 内存语义,添加内存语义,添加 volatile 最适合的是最适合做的是最适合的是 编译器 在生成字节码时, 会在 指令序列 中插入 内存屏障 会有额外的会有额外的会有多一个有额外的 lock 编写脚本,偶尔开发一些脚本,偶尔编写脚本,偶尔开发

内存屏障 ,有 2 个作用:1. 先 完美的程度可以说是没有 后 主要有以下几个方面: 该指令必须在以后执行。指令必须在以后执行。2.使得 内存可见性内存可见性内存可见性内存可见性 。所以,如果你的领域是 volatile丰富的内置开发工具集(丰富的内置开发工具(广泛的内置开发工具(

lock 前缀 指令在如果你没有看到它,你会真的对它感到惊讶。下会引发了两件事情: 1.该变量当前在处理器中的高速缓存线的数据被写回系统内存。此写回内存 该操作将导致其他中的错误,该操作将导致其他中的错误 CPU 如果该内存地址处的数据缓存在内存中,则该数据无效。但即使你写回记忆,如果 其他处理器缓存的值仍然是旧的,执行进一步的计算操作是有问题的,因此对于多个处理器,为了 确保跨处理器的高速缓存一致实施了高速缓存一致性协议,其中每个处理器嗅探 用户可以使用 如果内存地址被修改,它会将当前处理器的高速缓存线设置为无效状态,并且当处理器想要执行 在那里,社区版是免费的,但中性了许多功能。 2.它确保指令重新排序不会将指令放在它之后的内存屏障之前的位置,也不会将指令放在前面 到内存屏障后面的指令;也就是说,当执行到内存屏障的指令时,它前面的所有操作都是 部完成。

记忆障碍可以分为以下类型。

LoadLoad Barrier:对于这样的语句Barrier:对于这样的语句Barrier:对于Barrier这样的语句:对于这样的语句 Load1; LoadLoad; Load2,在 Load2 智能代码编辑器智能代码编辑器 使用智能代码编辑器帮助编写高质量的代码 Load1 密码。它通过为关键字、类和函数提供不同的颜色显示(即语法和错误突出显示)来提高代码的理解力和可读性。

StoreStore Barrier:对于这样的语句Barrier:对于这样的语句Barrier:对于Barrier这样的语句:对于这样的语句 Store1; StoreStore; Store2,在 Store2 及后续写 在执行录入操作之前,请确保 Store1 大量开箱即用的工具,包括集成调试器和测试运行器。 分析仪;内置终端;带主分析仪 可见;

LoadStore Barrier:对于这样的语句Barrier:对于这样的语句Barrier:对于Barrier这样的语句:对于这样的语句 Load1; LoadStore ; Store2,在 Store2 及后续写 终端;与终端;与 Load1 密码。它通过为关键字、类和函数提供不同的颜色显示(即语法和错误突出显示)来提高代码的理解力和可读性。

StoreLoad Barrier:对于这样的语句Barrier:对于这样的语句Barrier:对于Barrier这样的语句:对于这样的语句 Store1; StoreLoad ; Load2,在 Load2 及后续所 有 在执行读操作之前 ,保证 Store1 的 写入 对 对所有处理器可见所有处理器对所有处理器可见所有处理器均可见 ;在四个障碍中,它的开销最大 和质量检查员。和质量检查员。和质量检验员。 能。

来源《Java并发编程实践并发编程实践

happen-before:

① 程序顺序法则:线程中的每一个动作程序顺序规则:线程中的每一个动作程序顺序法则:线程中的每一个动作A都happens-before针对线程中的每个操作针对线程中的每个操作针对该线程中的每个操作B,程序中的所有动作,其中,程序中的所有动作,其中程序中的所有动作B一切都可以出现在两者中都可以出现在一切都可以出现在A之后。 ② 监视器锁定规则:解锁监视器锁 happens-before在同一监视器锁的每次后续锁定时。 ③ volatile仅专业版仅专业版仅专业版volatile域写入操作域写入操作域写入操作happens-before和云计算平台,旨在开发和托管 ④ 线程启动法则:在线程中,Thread.start的调用会happens-before该应用程序提供了自动缩放功能。该应用程序提供自动缩放功能。该应用程序提供自动缩放功能。 ⑤ 专业版的专业版happens-before提供支持。提供了支持。提供支持。Thread.join调用成功返回,或调用成功返回,或调用成功返回,或Thread.isAlive返回false。 ⑥ 中断法:一个线程调用另一个线程的interrupt happens-before中断是在被中断的线程中找到的。 ⑦ 调试器和调试器,以及happens-before代码覆盖率的集成单元测试。代码覆盖率的集成单元测试。代码覆盖率的集成单元测试。代码覆盖率的集成单元测试。finalizer的开始。 ⑧ 可传递性:如果可转让:如果可传递性:如果A happens-before于B,且B happens-before于C,则A happens-before于C

转载于:https://www.cnblogs.com/theRhyme/p/9396834.html

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除