当前位置: 首页 > article >正文

JAVA并发-volatile底层原理

volatile相当于是一个轻量级的synchronized,一般作用在变量上,它具有三个特性:可见性、有序性,相比于synchronized,他的执行成本更低。

先来说可见性,java存在共享变量不可见性的原因就是,线程不可以直接操作主内存,他需要虚拟一个本地内存,正是因为这样,这两个内存就容易因为多线程的原因出现主内存和本地内存不一致的现象,而volatile就是解决了这点,具体就是通过一个Lock指令,这个指令使得当你在访问变量的时候需要判断你的内存地址是否有效,如果有效则更改并且会通知其他处理器缓存使得他们对于这个共享变量的内存地址都失效,如果发先内存地址实效,则需要重新从本地内存读取,从而实现了可见性。

有序性是有效避免了编译器和处理器对指令的重排序,它在编译器生成字节码时插入内存屏障(CPU指令)来禁止指令重排序从而解决。

volatile只能保证在读取和写入的操作是最新的但是对于i++这种复合操作就无法确保原子性。


http://www.kler.cn/a/592653.html

相关文章:

  • opencv初步学习——图像处理2
  • Day67 | 灵神 | 二分查找:统计公平数对的数目
  • SQLMesh系列教程:SQLMesh虚拟数据环境
  • 台式机电脑组装---电源
  • 【C++】STL(1) - 序列容器
  • Java设计模式之模板方法模式(Template Method Pattern)
  • Redis 三主三从集群部署的完整方案
  • ASP3605同步降压调节器——满足汽车电子严苛要求的电源芯片方案
  • 进程间通信(1)——管道
  • 数据结构知识点1
  • excel文件有两列,循环读取文件两列赋值到字典列表。字典的有两个key,分别为question和answer。将最终结果输出到json文件
  • 使用STM32CubeMX+DMA+空闲中断实现串口接收和发送数据(STM32G070CBT6)
  • 【开源宝藏】30天学会CSS - DAY3 第三课 滑动文本+变色
  • mysql 索引的使用
  • mapbox-gl源码中解析style加载地图过程详解
  • 线性规划的标准形式
  • Golang开发
  • 【Dive Into Stable Diffusion v3.5】1:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练
  • 使用 Wireshark 在 Ubuntu 22.04 上抓包分析网络流量
  • 危化品经营单位考试:从基础夯实到能力提升的进阶之路​