JAVA线程安全之volatile

本文探讨了JAVA中的volatile关键字,解释了其内存可见性和防止指令重排序的作用,强调volatile仅保证可见性而不保证原子性。文章还讨论了为何及在何种条件下使用volatile,并指出自增操作等例子中volatile的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

volatile

volatile原理是基于CPU内存屏障(Memory Barrier)指令实现的;

如果一个变量被 volatile 关键字修饰时,那么对这的变量的写是将本地内存中的拷贝刷新到共享内存中;对这个变量的读会有一些不同,读是无视本地内存拷贝,只是从共享变量中去读取数据并拷贝到本地工作内存;

volatile并不能真正保证线程安全,它只能确保一个线程修改了共享数据后,其他线程能看到这个改动,即保证的是可见性,但不能保证原子性

内存可见性

由于Java内存模型(JMM)规定,所有的变量都存放在主内存中,而每个线程都有着自己的工作内存(高速缓存);线程在工作时,需要将主内存中的数据拷贝到工作内存中。这样对数据的任何操作都是基于工作内存(效率提高),并且不能直接操作主内存以及其他线程工作内存中的数据,之后再将更新之后的数据刷新到主内存中;

1.这里所提到的主内存可以简单认为是堆内存,而工作内存则可以认为是栈内存;
2.当一个变量被 volatile 修饰时,任何线程对它的写操作都会立即刷新到主内存中,并且会强制让缓存了该变量的线程中的数据清空,必须从主内存重新读取最新数据;
3.volatile 修饰之后并不是让线程直接从主内存中获取数据,依然需要将变量拷贝到工作内存中;

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值