前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >volatile关键字解析

volatile关键字解析

作者头像
CBeann
发布2023-12-25 19:10:09
1390
发布2023-12-25 19:10:09
举报
文章被收录于专栏:CBeann的博客

并发编程中的三个概念

原子性

原子性其实在数据库中也有体现,拿转账为例,张三给李四转1块钱,业务逻辑为张三减1块钱,李四加一块钱,这些必须同时成功。此处略去一万字。

可见性

操作系统

当CPU访问数据的时候,其实是有多级缓存的,如下图所示(深入理解计算机系统 原书第三版 ),当多个CPU去访问一个数据的时候,他会把主存中的数据先缓存到高速缓存里,然后在执行操作,那么此时如果两个CPU同时执行a=a+1操作,如果没有一定的同步方法,那么就会出现修改丢失的问题,因此可见性就是保证当一个CPU或者线程对某一个共享变量修改后,对其他CPU或者线程可见。

在这里插入图片描述
在这里插入图片描述
从JMM看

Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。 其实还是和操作系统中一样的问题。需要实现当一个线程对某个变量修改后对其他线程可见。

在这里插入图片描述
在这里插入图片描述

有序性

除了引入了时间片以外,由于处理器优化和指令重排等,CPU还可能对输入代码进行乱序执行,比如load->add->save 有可能被优化成load->save->add 。这就是有序性问题。

如下面代码所示,逻辑为先初始化context,然后在做一些事情

代码语言:javascript
复制
  //线程1
    boolean init = false;(1)
    String context = initialContext();(2)
    init = true;(3)
    
    
    //线程2
    while (!init){ (4)
      sleep(1L);
    }
    context.doSomeThing();(5)

但是如果出现了重排序的情况,线程1先执行(1)(3),那么此时线程2执行(4),在context还没有初始化的情况下,就进行了操作,这是有问题的。

volatile底层实现

层面

体现

java源码

volatile int i 关键字

ByteCode字节码

ACC_VOLATILE

JVM虚拟机

JVM内存屏障

操作系统

MESI 原语支持 总线锁

java源码

其实在java源码中看,volatile其实就是一个关键字

代码语言:javascript
复制
public class Start {
  private static volatile Start ins = null;
  public static Start getInstance(){
    if (ins == null){
      synchronized (Start.class){
        if (ins == null){
          ins = new Start();
        }
      }
    }
    return ins;
  }
  public static void main(String[] args) {
    System.out.println(1);
  }
}
字节码

从字节码角度看,其实就是在一个变量上打一个标记。

在这里插入图片描述
在这里插入图片描述
JVM虚拟机规范
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
StoreStoreBarier
volatile 写操作
StoreLoadBarier

LoadLoadBarier
volatile 读操作
LoadStoreBarier
操作系统

缓存一致性协议MESI。

  1. lfence,是一种Load Barrier 读屏障。在读指令前插入读屏障,可以让高速缓存中的数据失效,重新从主内存加载数据
  2. sfence, 是一种Store Barrier 写屏障。在写指令之后插入写屏障,能让写入缓存的最新数据写回到主内存
  3. mfence, 是一种全能型的屏障,具备ifence和sfence的能力

参考

https://www.bilibili.com/video/BV1QT4y1L7G9?p=5

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 并发编程中的三个概念
    • 原子性
      • 可见性
        • 有序性
          • java源码
          • 字节码
          • JVM虚拟机规范
          • 操作系统
      • volatile底层实现
      • 参考
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档