Java 多线程--volatile详解

本文详细介绍了Java中volatile关键字的作用,包括如何解决可见性问题,通过缓存一致性协议和总线嗅探确保数据同步。同时,文章探讨了volatile如何保证有序性,禁止指令重排序,但指出它无法解决原子性问题。文中还讨论了volatile在单例模式中的应用,并总结了其适用场景和限制。
摘要由CSDN通过智能技术生成

一、volatile简述

volatile是JMM的一种具体实现方式,是一种轻量级的synchronized,用于修饰共享变量,在多线程环境下能够保证原子性可见性有序性

二、volatile如何解决可见性问题

volatile修饰的变量如何保证在其被修改之后,能够被其他线程立马得到修改之后的值?

缓存一致性协议

当CPU写数据的时候发现这个变量是共享变量的时候,会发出信号通知(总线嗅探)其他CPU将该变量的缓存设置成无效状态,因此当其他CPU需要读取的时候,发现当前变量的缓存行被设置成无效了,自然会到主内存中读取最新的变量值。(那么其他CPU如何发现数据是否无效呢?)

总线嗅探

每个处理器通过嗅探在总线上传播的数据来检查自己的缓存是不是过期了,如果过期了,则会将自己的处理器缓存行设置成无效状态,等下次处理器去读取缓存行的时候会发现缓存过期,自然去主内存中读取最新的数据。

总线风暴

由于volatile的缓存一致性,需要其他CPU不断地从主内存嗅探,无效的交互会导致总线带宽达到峰值,因此不要大量使用volatile。

三、volatile如何做到有序性,禁止指令重排序

为什么会重排序?

因为在程序执行时,为了提高性能,编译器和处理器</

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值