Java关键字volatile,原子性,变量可见性

本文探讨了在多CPU系统中,由于CPU缓存导致的数据不一致性问题,并介绍了两种解决方案:总线加LOCK锁和缓存一致性协议。接着,文章详细讲解了Java并发环境中的原子性、可见性和有序性,指出volatile关键字在确保可见性方面的作用,但无法保证原子性。最后,文章提到了volatile的局限性,强调其通常适用于只有一个可变字段的场景。
摘要由CSDN通过智能技术生成

  1. 内存模型与CPU缓存

本来CPU计算的数字都是从主从main memory中读取的,但是CPU运行的速度比计算机读取内存的速度快,为了补齐这个短板,所以出现了CPU缓从这种东西。

在多CPU系统(或多核处理器——一个芯片上有多个CPU),每个CPU有自己的缓存。两个线程A,B在不同的CPU上同时跑,A对主存的某个共享变量修改后会暂时存在CPU a的缓存中。线程B在CPU b上跑,B仍旧是从主存中读取该共享变量,此时B读到的就是旧值了。就出现了数据的不一致性。

这里出现不一致的条件:必须是多个线程并且访问共享变量,而不是普通变量。

 为了解决这个问题,有两种方式:

在总线上加LOCK#锁;

使用缓从一致性协议,比如MESI协议。

2. 并发环境下的可见性、原子性、有序性

原子性:一个操作,要么执行,要么不执行,在执行的过程中不会被打断。

JAVA原子性适用于除了long和double

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值