首页 > 其他分享 >volatile

volatile

时间:2023-02-20 07:55:16浏览次数:24  
标签:flag 线程 内存 thread1 volatile true public

缓存一致性问题

每个线程都有自己的工作内存。
线程在初始化时从主内存读取所需的变量值到工作内存。
在线程运行时,如果是读取则从工作内存中读取,如果是写入则先写到工作内存再刷新到主内存。
在并发情况下可能出现不同线程持有不同的共享变量值。例如,A线程修改了共享变量值并刷新到主内存,但B、C线程在读取该共享变量值时从本线程的工作内存读取,读取到的值不是最新的。

模拟问题

public class Main extends Thread {
    private static boolean flag = false;

    public Main(String name) {
        super(name);
    }

    @Override
    public void run() {
        // 等待1s确保main线程读到的flag是旧值false,否则会读到thread1设置flag后的新值true
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("begin to set flag true");
        flag = true;
        System.out.println("set flag true end");
    }

    public static void main(String[] args) throws InterruptedException {
        Main thread1 = new Main("thread1");
        thread1.start();

        while (!flag) {

        }

        System.out.println("end");
    }
}

volatile关键字作用

保证可见性(线程读写直接访问主内存,而不是自己的工作内存)
禁止指令重排序(内存屏障)
不保证线程安全(不能保证对变量的操作是原子性的)

解决问题

flag字段加上volatile

public class Main extends Thread {
    private volatile static boolean flag = false;

    public Main(String name) {
        super(name);
    }

    @Override
    public void run() {
        // 等待1s确保main线程读到的flag是旧值false,否则会读到thread1设置flag后的新值true
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("begin to set flag true");
        flag = true;
        System.out.println("set flag true end");
    }

    public static void main(String[] args) throws InterruptedException {
        Main thread1 = new Main("thread1");
        thread1.start();

        while (!flag) {

        }

        System.out.println("end");
    }
}

标签:flag,线程,内存,thread1,volatile,true,public
From: https://www.cnblogs.com/WJQ2017/p/17136103.html

相关文章

  • 决战圣地玛丽乔亚Day14 ----Volatile关键字分析
    volatile:背景: CPU和主存读写速度不一致,出现了高速缓存。把一些经常读的数据存入高速缓存,交互计算和高速缓存进行,修改完毕后再从高速缓存刷回主存中。但是问题来了!CPU......
  • volatile的实现原理-内存屏障
     被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的内存屏障,以此来解决可见性跟重排序的问题。内存屏障的作用:1.在有内存屏障......
  • Synchronized和Volatile的对比
    Synchronized和Volatile是并发中的两大关键字,有相似性和不同点。Synchronized更详细介绍参考https://www.cnblogs.com/spark-cc/p/17069585.htmlvolatile简单来说就是轻......
  • 看一遍就懂,详解java多线程——volatile
    多线程一直以来都是面试必考点,而volatile、synchronized也是必问点,这里我试图用容易理解的方式来解释一下volatile。来看一下它的最大特点和作用:一使变量在多个线程间可见......
  • 单例模式为什么要加volatile修饰?
    单例模式为什么要加volatile来修饰?解析:这里我们自己应该要先搞清楚面试官问的到底是什么?因为单例模式有四种实现:饿汉模式,懒汉模式,静态内部类,枚举搞清楚问的是哪一种,其......
  • volatile和synchronized关键字
    1.volatile关键字 Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这......
  • Java volatile
    JMM:Java内存模型要想学习volatile,就不得不了解JMM。JVM运行程序的实体是线程,每个线程在被创建时JVM都会为其创建一个自己私有的工作内存。而Java内存模型规定所有的变......
  • 【并发】sychronized、volatile
    介绍数据不一致问题,究其原因是多个线程对同一对象的成员变量同时操作引起的。synchronize关键字提供排他机制,在同一时间点只有一个线程执行。1.使用方式同步方法解决......
  • C语言关键字volatile
    C语言关键字volatile表明某个变量的值可能随时被外部改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新读取。volatile的本意是指这个值可能会在当前线程外部......
  • volatile关键字解析
    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java5之后,volatile关键字才......