IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java volatile只保证可见性和禁止指令重排,不保证原子性 -> 正文阅读

[Java知识库]Java volatile只保证可见性和禁止指令重排,不保证原子性

volatile关键字作用(变量可见性、禁止指令重排序)

前置知识:内存读取的速度跟不上CPU的速度(会降低CPU执行指令的速度),所以有了CPU高速缓存
也就是说,CPU在从主存读取数据的时候,会从复制一份数据到缓存中,运算结束再把数据刷新到主存中。
MSI协议(缓存一致性):主存有一个共享变量,多个CPU缓存复制一份副本,如果主存中共享变量修改,所以CPU缓存中副本都失效。

1、变量可见性(变量修改->重新到主存读数据)

当一个变量被修饰为volatile的时候,一旦这个变量被写修改了,其他缓存中这个变量的副本就会全部失效,因此得重新到主存中读最新的变量。
这就保证了当一个线程修改了某个值,其他线程就可以立即获取。

2、禁止指令重排序

举个例子,创建对象实例需要三个过程

  1. 在堆中开辟内存
  2. 调用构造器进行初始化
  3. 将对象引用复制给变量
    但是由于指令重排并不保证2一定在3前面执行,但1一定是最先执行的的(2,3对1有依赖关系)
    如果此时3先执行,然后访问成员,由于还没执行2的初始化,会导致异常。
    表示加入内存屏障,告诉CPU和编译器,这个屏障前后的指令不能进行重排序。

volatile不保证原子性

有个变量 int cnt=0;

  1. 线程A和线程B同时读到缓存中都是cnt=0
  2. 线程A先执行 cnt=cnt+1,得到cnt=1存放到寄存器A中,然后线程A就阻塞了。由于寄存器A中的值还未刷新到主存中,所以主存中的数据还是cnt=0,线程B中cnt=0缓存还不会失效。
  3. 此时线程B马上执行cnt=cnt+1,并马上刷回到主存中,此时触发MSI(缓存一致性原则),导致线程A中缓存值失效。
  4. 线程A中值cnt失效,重新到主存中获取cnt=1,然后再把寄存器(MSI协议并不会映像到寄存器)中的cnt=1刷新到主存中,这就导致了线程安全问题。
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-31 23:49:43  更:2022-03-31 23:53:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:28:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码