news 2026/5/9 2:24:42

Java中volatile和synchronized关键字的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java中volatile和synchronized关键字的区别

核心区别

volatile解决的是可见性问题和禁止指令重排序(内存屏障),但不保证原子性。
synchronized解决的是可见性、原子性和有序性问题(通过monitor锁的happens-before规则)。

详细对比表

特性volatilesynchronized
原子性❌ 不保证✅ 保证(代码块/方法整体原子执行)
可见性✅ 保证(写入立即刷新到主内存)✅ 保证(解锁前写入主内存)
有序性✅ 有限保证(禁止指令重排序)✅ 保证(遵循happens-before规则)
性能轻量级,仅内存操作重量级,涉及锁的获取和释放
适用场景状态标志、一次性发布等临界区保护、复合操作等

关键点:volatile能解决的问题,synchronized不一定需要

从能力上来说:synchronized理论上可以替代volatile,因为synchronized保证了:

  1. 原子性(volatile不具备的)
  2. 可见性(volatile具备的)
  3. 有序性(volatile部分具备的)

从实践上来说不需要也不应该用synchronized替代volatile

实际场景分析

✅ 适合volatile的场景(synchronized太重)

// 状态标志位 - volatile是最佳选择publicclassShutdownManager{privatevolatilebooleanshutdownRequested=false;publicvoidrequestShutdown(){shutdownRequested=true;// 单写操作}publicbooleanisShutdownRequested(){returnshutdownRequested;// 多读操作}}// 双重检查锁定单例模式publicclassSingleton{privatestaticvolatileSingletoninstance;publicstaticSingletongetInstance(){if(instance==null){synchronized(Singleton.class){if(instance==null){instance=newSingleton();// 需要volatile防止重排序}}}returninstance;}}

❌ volatile无法解决的问题(需要synchronized)

// 复合操作 - volatile无法保证原子性classCounter{privatevolatileintcount=0;// volatile在这里没用!publicvoidincrement(){count++;// 实际上分成三步:读、改、写}}// 需要synchronized的正确实现classSafeCounter{privateintcount=0;publicsynchronizedvoidincrement(){count++;}}

性能考虑

// 多线程频繁读取的场景publicclassConfiguration{// volatile读取几乎无开销,只是内存访问privatevolatileStringconfigValue;publicStringgetConfig(){returnconfigValue;// 纯读操作,volatile最合适}// 如果用synchronized,每次读取都要获取锁privateStringconfigValue2;publicsynchronizedStringgetConfig2(){returnconfigValue2;// 性能差!}}

总结

  1. 能力包含关系:synchronized的功能包含volatile的功能,但反之不成立

  2. 设计原则:应该使用能满足需求的最轻量级机制

  3. 选择指南

    • 使用volatile当:

      • 变量被多个线程访问,但只有一个线程写入
      • 变量作为状态标志使用
      • 需要确保对象发布的可见性(如单例模式)
    • 使用synchronized当:

      • 操作是复合的(读-改-写)
      • 需要保护临界区
      • 需要保证多个变量的一致性更新
  4. 重要原则:不要因为synchronized"更强大"就滥用它。并发编程中,应该选择最简单、最明确的工具来解决特定问题。

volatile能解决的问题synchronized都能解决,但从性能和设计角度,应该使用最适合的工具。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 12:17:58

GLM-TTS批量推理功能全解析:自动化音频生产的最佳实践

GLM-TTS批量推理功能全解析:自动化音频生产的最佳实践 在内容创作进入“AI工业化”时代的今天,语音合成已不再是简单的“文字转声音”工具,而是支撑有声读物、在线教育、智能客服等业务的核心生产力。面对动辄数百篇课文、上千条产品解说的生…

作者头像 李华
网站建设 2026/5/1 6:38:08

出租车计费系统准确性测试:策略、挑战与最佳实践

在数字化转型浪潮中,出租车计费系统作为核心业务组件,其准确性直接影响用户体验、企业声誉和法规合规性(如2025年交通运输部发布的《网约车计费规范》)。作为软件测试从业者,确保计费逻辑无偏差至关重要。本文基于行业…

作者头像 李华
网站建设 2026/5/1 12:07:54

2026年运维转行建议,低端运维的出路在哪里?

前言 说实话,运维工程师这个岗位在IT行业里面确实是处于最底层的,不管什么环节出现问题,基本都是运维背锅。,薪资水平也比不上别的岗位。一般运维的薪资水平大多数都是6-9K,还要高频出差年轻的时候干几年确实还可以&a…

作者头像 李华
网站建设 2026/5/3 5:40:21

【PHP物联网编程进阶】:7个关键场景实现家居设备无缝联动

第一章:PHP在智能家居设备联动中的核心作用 在现代智能家居系统中,设备间的高效通信与逻辑控制是实现自动化场景的关键。PHP 作为一种成熟且广泛部署的服务器端脚本语言,凭借其快速开发能力、丰富的扩展库以及与 Web 技术的天然集成优势&…

作者头像 李华
网站建设 2026/5/1 14:24:44

零样本语音生成新突破:GLM-TTS结合高性能GPU实现秒级合成

零样本语音生成新突破:GLM-TTS结合高性能GPU实现秒级合成 在内容创作日益个性化的今天,一条短视频可能需要数十条不同音色的旁白,一款游戏NPC要具备情绪起伏的对白,而传统语音合成系统还在为每个角色准备数小时录音、进行模型微调…

作者头像 李华
网站建设 2026/5/8 21:18:21

从入门到精通:构建可移植PHP容器的环境变量设计模式(稀缺干货)

第一章:从零理解PHP容器化与环境变量核心概念在现代Web开发中,PHP应用的部署正逐步从传统服务器迁移至容器化环境。容器化通过封装应用及其依赖,确保在任何环境中一致运行。Docker 是实现这一目标的核心工具,它利用镜像和容器机制…

作者头像 李华