zoukankan      html  css  js  c++  java
  • Java volatile关键字实现原理

    场景引入 可见性问题

    先来看一张图:

    上面的图,是简化版的Java内存模型,一个线程有自己的工作内存,同时还有一个共享的主内存。

    线程1和线程2读取数据data时,先从主内存里加载data变量的值到工作内存,然后才可以使用那个值。

    假设现在线程1修改了data变量的值为1,然后将这个修改写入到自己的工作内存。那么此时,线程1的工作内存里data的值为1,而主内存里data的值还是0。线程2的工作内存data值也是0。

    这就尴尬了,线程1和线程2操作的是用一个变量data,但由于线程本地缓存的存在,导致线程1对data变量的修改,线程2不能及时看到。

    这就是Java并发编程中的可见性问题当一个线程修改某个共享变量的值,其他线程是否能够立即知道这个修改。

    值得注意的是,上面的Java内存模型是极其简化的,真实的情况远比上面复杂。

    volatile的作用及实现原理

    要解决上述可见性问题,我们可以使用volatile关键字。

    在加入volatile关键字后,线程1只要修改data变量的值,就会在修改工作内存data变量值的同时,强制将修改刷新到主内存中。与此同时,线程2需要读取data变量时,先强制将主内存的值刷新到工作内存中,从而保证线程2每次读取都是最新的值。如下图:

    volatile工作原理如上所述,其在JVM底层的实现原理,涉及到内存屏障相关概念。简单来说,JVM在在遇到volatile变量时,在其写操作之后插入一个store屏障,在其读操作之前插入一个load屏障。

  • 相关阅读:
    【jQuery】添加删除记录练习
    git
    常用正则表达式
    【资源】前端插件
    menu 菜单显示隐藏-jquery实现
    java作业——Day006
    java作业——Day005
    java作业——Day004
    java作业——Day003
    java作业——Day001
  • 原文地址:https://www.cnblogs.com/bluemilk/p/11269505.html
Copyright © 2011-2022 走看看