zoukankan      html  css  js  c++  java
  • Volatile关键字——内存可见性

      所有线程的共享变量都存储在主内存中,每一个线程都有一个独有的工作内存,每个线程不直接操作在主内存中的变量,而是将主内存上变量的副本放进自己的工作内存中,只操作工作内存中的数据。当修改完毕后,再把修改后的结果放回到主内存中。每个线程都只操作自己工作内存中的变量,无法直接访问对方工作内存中的变量,线程间变量值的传递需要通过主内存来完成。
     
    如下图:

    示例代码:

    /**
     * @author huxin
     * 创建时间:2021/5/3
     */
    public class VolatileTest {
        public static /*volatile*/ boolean flag = false ;   
    
        public static void main(String[] args) throws  Exception{
    
            new Thread( ()->{
                System.out.println("______begin__________");
                while (!flag){
    
                }
                System.out.println( "----------end---------");
    
            }).start();
    
            Thread.sleep( 2000l);   //这一句确保第一个线程在自己的工作内存上读到flag变量
    
            new Thread( ()->{
                prepareData();
            }).start();
        }
    
        public static void prepareData(){
            System.out.println("prepare set flag to true");
            flag = true ;
            System.out.println("finish set flag to true");
        }
    
    }

    以上代码,如果不加 volatile 关键字,while(!flag)会一直等待,说明它的flag值为false,从而验证了另一个线程更新了共享变量它没读到.

  • 相关阅读:
    [原]Android 开发第一步
    [转]使用Android-Studio 开发Android 程序
    [转]VS2010 常用插件
    [转]FluentData
    BUUCTF-[HCTF 2018]WarmUp
    2019.11.11读书笔记
    2019.11.9读书笔记
    记录一道神仙CTF-wtf.sh-150
    SDOI2018 一轮培训划水祭
    [SHOI2009]会场预约
  • 原文地址:https://www.cnblogs.com/hzhuxin/p/14728119.html
Copyright © 2011-2022 走看看