volatile实现原理

volatile关键字能确保线程间数据的可见性和一定的有序性,但不保证原子性。在JVM中,volatile是通过内存屏障来实现这一特性的。由于CPU高速缓存可能导致数据一致性问题,为此引入了缓存一致性协议,如MESI协议来解决。volatile不能保证i++操作的线程安全性,可以使用AtomicInteger等原子类借助CAS操作来保证线程安全。然而,CAS可能会遇到ABA问题,并且长时间自旋会带来开销。
摘要由CSDN通过智能技术生成

volatile实现原理

volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性,即 volatile 保证了 可见性和有序性 没有原子性 。在JVM底层volatile是采用“内存屏障”来实现的。

  • 问题的提出 计算机在运行程序时,每条指令都是在CPU中执行的,在执行过程中势必会涉及到数据的读写。我们知道程序运行的数据是存储在主存中,这时就会有一个问题,读写主存中的数据没有CPU中执行指令的速度快,如果任何的交互都需要与主存打交道则会大大影响效率,所以就有了CPU高速缓存。CPU高速缓存为某个CPU独有,只与在该CPU运行的线程有关。

有了CPU高速缓存虽然解决了效率问题,但是它会带来一个新的问题:数据一致性。在程序运行中,会将运行所需要的数据复制一份到CPU高速缓存中,在进行运算时CPU不再也主存打交道,而是直接从高速缓存中读写数据,只有当运行结束后才会将数据刷新到主存中。举一个简单的例子:

    i++i++
    当线程运行这段代码时,
    首先会从主存中读取i( i = 1),
    然后复制一份到CPU高速缓存中,
    然后CPU执行 + 1 (2)的操作,
    然后将数据(2)写入到告诉缓存中,
    最后刷新到主存中。
    其实这样做在单线程中是没有问题的,有问题的是在多线程中。如下:
    
    假如有两个线程A、B都执行这个操作(i++),按照我们正常的逻辑思维主存中的i值应该
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值