首页 > 其他 > 详细

volatile

时间:2020-02-19 10:48:45      阅读:55      评论:0      收藏:0      [点我收藏+]

作用 

  1:内存可见性
    对于共享变量,有一个线程修改了其值,其他线程也能看到,使用的也是最新的值
    thread1修改的了变量,thread2也能感知(通过一些机制,使多线程之间的变量保持内存可见);但不保证一致性
  2:禁止重排序
    cup不在重排执行顺序

  3:不保证原子性

/**
 * 缓存不一致的问题
 * <p>
 * jvm的重排序,happen_before的规则
 * volitate关键字
 * 1:保证内存可见性
 * 2:代码执行顺序
 * 程序运行的时候,会将数据从"主存"中复制一份,放到"高速缓存"中
 */
public class _01Volatile {

    private volatile static int INIT_VALUE = 0; //是否有volatile,执行的结果不同(volatile的内存可见性)
    private volatile static int MAX_VALUE = 5;

    public static void main(String[] args) {
        /*
            此线程只有read的操作,java做的优化,只从cache中拿数据,不更新主内存
         */
        new Thread(() -> {
            int localValue = INIT_VALUE;
            while (localValue < MAX_VALUE) {
                if (localValue != INIT_VALUE) {
                    System.out.printf(" the value update to [%d] \n", INIT_VALUE);
                    localValue = INIT_VALUE;
                }
            }
        }, "reader").start();


        new Thread(() -> {
            int localValue = INIT_VALUE;
            while (INIT_VALUE < MAX_VALUE) {
                System.out.printf(" the value update to [%d] \n", ++localValue);
                INIT_VALUE = localValue;
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "update").start();
    }

    /*
        i=i+1;
           1:从主内存把i获取
           2:将i缓存到cache中
           3:执行cpu指令,将i+1
           4:将结果刷到缓存中
           5:将结果刷到主存中(i有修改)
           i:main memory->cache->(+1)->cache->main memory
     */
}

 

 

 

volatile

原文:https://www.cnblogs.com/draymond/p/12329905.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!