violated关键字作用

Java内存模型如上,需要注意以下几点:

所有线程的共享变量都保存在主内存中
每个线程都有自己的工作内存,其中保存主内存中共享变量的副本
线程对共享变量进行修改时,先会对工作内存中的值进行修改,之后在传入主内存中

显然,这种值更新机制在多线程的场景下会产生很大的问题,典型的例子就是两个线程同时对同一共享变量进行修改,由于上面的步骤,会导致主内存中的值只是后提交线程的修改结果,而前一进程的修改遗失。此时需要采用同步机制来消除这一问题,当然可以使用synchronized或用同步锁(Lock)来解决这一问题,但这些方式增加了较大的系统开销,因此不建议使用;而通过volatile关键字修饰该共享变量可以很好的解决这一问题,因为一旦某线程对该共享变量的值进行修改,那么会立即刷新会主内存中,并且其他线程工作内存中的变量副本也失效,需要重新到主内存中读取共享变量的值。这里可以看成是一种通知行为,一旦用volatile修饰的变量发生改变,系统会通知其他线程该变量已经改变(将其他线程中该变量设置为无效状态),需要重新读取。由此volatile保证了可见性。

原文链接:https://blog.csdn.net/weixin_40388441/article/details/106963870

一.前言
1.编译器优化介绍:

由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器;调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令。对常规内存进行优化的时候,这些优化是透明的,而且效率很好。由编译器优化或者硬件重新排序引起的问题的解决办法是在从硬件(或者其他处理器)的角度看必须以特定顺序执行的操作之间设置内存屏障(memory barrier),linux 提供了一个宏解决编译器的执行顺序问题。

void Barrier(void)

这个函数通知编译器插入一个内存屏障,但对硬件无效,编译后的代码会把当前CPU寄存器中的所有修改过的数值存入内存,需要这些数据的时候再重新从内存中读出。

2.volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以消除一些代码。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化。

二.volatile详解:
1.volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)
https://blog.csdn.net/iteye_13254/article/details/82305002?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163713360716780357223379%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163713360716780357223379&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-7-82305002.pc_search_es_clickV2&utm_term=volatile%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF&spm=1018.2226.3001.4187

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学无止境2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值