JMM内存模型及Volatile的原子性Demo

关于Java内存模型自己的理解:

        JVM运行程序的实体是线程,而每个线程在运行时都会为其创建一个独立的内存空间(Java栈,线程私有的),而成员变量是存储在堆空间(线程共享的),JMM规定所有变量都存储在主内存,所有线程都可访问,但是不能直接操作主内存中的变量,对变量的操作(读取赋值等)必须在工作内存中进行,因此要将变量从主内存拷贝到自己的工作空间,然后对变量进行操作,操作完成再将变量写回主内存,因此不同的线程无法访问对方的工作内存,线程间的通讯(传值) 必须通过主内存来完成。

volatile可见性代码演示:

public class TestVolatile {
    private static volatile int a = 0;

    public static void main(String[] args) {
        new Thread(() -> {
            try {
                //保证所有线程都能读到a的值,a的值更新操作需要1S
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            a = 22;
        }).start();

        //因为加了volatile关键字,main线程可以感知到a的变化
        while (a == 0) {
        }
        //因此这里很快就打出了a的值,如果不加此关键字,会一直在while循环,不会走到这里
        System.out.println(a);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值