volatile关键字的可见性测试

本文通过两个示例展示了Java中volatile关键字对于内存可见性的影响。在未使用volatile的情况下,线程1修改的变量num无法立即在主线程中看到变化,导致主线程工作内存中的num值未刷新。而当num变量被volatile修饰后,线程1的修改能够立即对主线程可见,确保了内存的正确同步。
摘要由CSDN通过智能技术生成

volatile 的可见性测试

A.未使用 volatile 的测试

class MyData{

    int num = 0;

    public void addNum(){
        this.num = 60;
    }

}

public class VolatileDemo {
    public static void main(String[] args) {

        MyData myData = new MyData();

        //线程1
        new Thread(()->{

            System.out.println(Thread.currentThread().getName() + "/t come in:" + myData.num);
            try {
                TimeUnit.SECONDS.sleep(3);
            }catch (Exception e){

            }
            myData.addNum();

            System.out.println(Thread.currentThread().getName() + "/t mission is over:" + myData.num);


        },"t1").start();

        //主线程操作
        while(myData.num == 0){
            //只有 num 刷新了,才会跳出循环
        }

        System.out.println(Thread.currentThread().getName() + " mission is over:" + myData.num);

    }
}

在这里插入图片描述
总结:线程1修改 num 值之后,主线程的工作内存中的 num 没有刷新;(num 不具有内存可见性)

B.使用 volatile 的测试

class MyData{

    volatile int num = 0;

    public void addNum(){
        this.num = 60;
    }

}

public class VolatileDemo {
    public static void main(String[] args) {

        MyData myData = new MyData();

        //线程1
        new Thread(()->{

            System.out.println(Thread.currentThread().getName() + "/t come in:" + myData.num);
            try {
                TimeUnit.SECONDS.sleep(3);
            }catch (Exception e){

            }
            myData.addNum();

            System.out.println(Thread.currentThread().getName() + "/t mission is over:" + myData.num);


        },"t1").start();

        //主线程操作
        while(myData.num == 0){
            //只有 num 刷新了,才会跳出循环
        }

        System.out.println(Thread.currentThread().getName() + " mission is over:" + myData.num);

    }
}

在这里插入图片描述
总结:线程1修改 num 值之后,主线程的工作内存中的 num 刷新了;(num 被 volatile 标记后具有了内存可见性)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值