volatile关键字

目录

一.volatile 能保证内存可见性

1、volatile修饰的变量,能够保证“内存可见性”

2、演示实例


一.volatile 能保证内存可见性

1、volatile修饰的变量,能够保证“内存可见性”

代码在写入volatile修饰的变量的时候:

  • 改变线程工作内存中volatile变量副本的值;
  • 将改变后的副本的值从工作内存刷新到主内存;

代码在读取volatile修饰的变量的时候:

  • 从主内存中读取volatile变量的最新值到线程的工作内存中;
  • 从工作内存中volatile变量的副本;

2、演示实例

           以下代码创建了两个线程,线程thread01一直在运行,因为isQuit静态变量等于0,但是thread02线程可以修改静态变量isQuit的值。按道理在thread02线程修改变量的值后,thread01线程就会停止运行,但是运行代码后,修改完变量,thread01线程并没有停止运行。原因是thread02线程在修改完isQuit变量的值后,存储在线程的工作内存中,并没有刷新到主内存中,所以thread01线程并没有读取到修改后的变量值,一直在运行。

public class Volatile {
    private  static int isQuit=0;
    public static void main(String[] args) {
        Thread thread01 = new Thread(()->{
            while (isQuit==0){
                //循环啥也没有执行
                //意味着一秒钟就会执行很多次
            }
            System.out.println("thread01执行完毕...");
        });
        Thread thread02 = new Thread(()->{
            System.out.print("请输入isQuit的值:");
            Scanner scanner = new Scanner(System.in);
            isQuit = scanner.nextInt();
        });
        thread01.start();
        thread02.start();
    }
}

为了避免上述情况的发生,保证变量的内存可见性,引入volatile关键字。 

private volatile static int isQuit=0;//volatile关键字让变量isQuit的内存变成可见性的 

volatile 不保证原子性 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爆浆曲奇饼~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值