Java中synchronized 和 volatile 的区别是什么?

synchronized保证原子性、可见性和有序性,适用于代码块或方法加锁,基于监视器实现,性能开销较大;volatile仅保证可见性和有序性,用于变量修饰,依赖内存屏障,不阻塞线程但不保证原子性;两者互补,按需选用。

java中synchronized 和 volatile 的区别是什么?

synchronizedvolatile 都是 Java 中用于处理多线程并发问题的关键字,但它们的作用和使用场景有明显区别

1. 保证的并发特性不同

synchronized 保证了原子性、可见性和有序性。它通过加锁机制确保同一时刻只有一个线程可以执行被 synchronized 修饰的代码块或方法,从而防止多个线程同时修改共享数据导致的问题。

volatile 只保证可见性和有序性,不保证原子性。当一个变量被声明为 volatile,任何线程对它的修改都会立即刷新到主内存中,其他线程读取时也能立刻看到最新值。但它不能防止多个线程同时进行读-改-写操作带来的竞态条件。

2. 使用范围不同

synchronized 可以修饰代码块、实例方法和静态方法,需要指定一个锁对象(对于实例方法是 this,静态方法是类对象)。

立即学习“Java免费学习笔记(深入)”;

volatile 只能修饰变量,不能修饰方法或代码块。

3. 实现机制不同

synchronized 是基于 JVM 的监视器锁(Monitor Lock)实现的,底层依赖操作系统的互斥量,属于重量级同步机制,但在 JDK 1.6 之后引入了偏向锁、轻量级锁等优化,性能已有大幅提升。

魔乐社区 魔乐社区

天翼云和华为联合打造的AI开发者社区,支持AI模型评测训练、全流程开发应用

魔乐社区 102 查看详情 魔乐社区

volatile 的实现依赖于内存屏障(Memory Barrier),在变量读写前后插入特定指令,确保变量的修改能及时同步到主内存,并禁止指令重排序。

4. 性能影响不同

synchronized 在发生竞争时可能导致线程阻塞,上下文切换开销较大,但无竞争时经过优化后成本较低。

volatile 不会引起线程阻塞,访问效率高,但由于每次读写都直接操作主内存,无法利用 CPU 缓存优势,频繁访问可能影响性能。

例如:用 volatile 修饰一个 boolean 标志位用来控制线程运行状态是合适的;但如果要对一个计数器进行自增操作(i++),即使变量是 volatile 的,也无法保证操作的原子性,必须使用 synchronized 或 AtomicInteger 等原子类。

基本上就这些。根据需求选择:需要原子性就用 synchronized 或原子类,只需要通知状态变化可用 volatile。两者不是替代关系,而是互补。

以上就是Java中synchronized 和 volatile 的区别是什么?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/565225.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 03:05:50
下一篇 2025年11月10日 03:06:48

相关推荐

发表回复

登录后才能评论
关注微信