synchronized和volatile

本文探讨了在多核CPU环境下,synchronized和volatile如何确保Java多线程中的内存可见性和有序性。synchronized通过锁机制提供原子性、可见性和有序性,而volatile仅保证可见性和有序性,不保证原子性。MESI协议保证缓存一致性,但volatile在某些场景下仍可能出现线程安全问题。文章通过实例分析了两者的区别和应用场景,并强调了状态标记量和单例模式中volatile的重要性。

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

前言:在早期,多核CPU使用锁总线的方式解决缓存同步问题,即一旦遇到lock指令便由仲裁器选择一个内核独占总线(cas做了锁了总线或缓存行还是volatile做了锁总线或缓存行? - 知乎),其他内核相当于被阻塞搁置,总线连接了各缓存、内存等硬件故锁总线效率很低,后来改用锁缓存(行)。

自从多核CPU出现后用MESI可严格保证缓存一致性,即CPU1中对共享变量修改后CPU2能立刻感知到,即可见性。但CPU受限于(需要等待)信号在核间的来回传输,因而出现了store buffer和invalid queue,但会导致重排序,即CPU1中两指令(准确说是代码)的顺序在CPU2的感知中是相反的,即有序性。用synchronized可同时保证原子性、可见性和有序性,其中原子性通过lock/unlock原子操作实现,后两者通过内存屏障实现(汇编代码中lock#指令与内存屏障的关系,volatile的底层是lock#指令还是内存屏障? - 知乎),volatile没用锁故只可保证后两者,只能通过敦促store buffer和invalid queue立即生效的方式在一定程度上保证线程间的同步,反例如两线程对共享变量做i++仍会出错(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值