news 2026/10/15 18:21:56

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/10/15 13:27:29

GLM-TTS输出路径说明:轻松找到你生成的每一个音频文件

GLM-TTS输出路径说明:轻松找到你生成的每一个音频文件 在语音合成系统越来越“黑盒化”的今天,一个看似不起眼却极为关键的问题浮出水面:我刚生成的那段语音,到底存到哪儿去了? 尤其是在使用像 GLM-TTS 这类基于大语言…

作者头像 李华
网站建设 2026/10/14 9:38:33

语音合成速度慢?这份GLM-TTS性能优化清单请收好

语音合成速度慢?这份GLM-TTS性能优化清单请收好 在短视频配音、AI主播、有声书自动生成等应用日益普及的今天,用户对语音合成系统的要求早已不止“能出声”这么简单。越来越多的开发者和内容创作者发现:功能强大的模型,往往卡在“…

作者头像 李华
网站建设 2026/10/14 10:29:45

金融-租赁:资产管理系统折旧计算测试报告

折旧计算在资产管理系统中的核心作用‌ 资产管理系统(AMS)是金融租赁行业的核心工具,用于跟踪资产全生命周期,其中折旧计算直接影响财务报告、税务合规和决策制定。在金融租赁场景下,折旧逻辑复杂(如直线法…

作者头像 李华
网站建设 2026/10/15 13:54:57

一次性解决跨域难题:构建高效PHP CORS响应的8步法则

第一章:一次性解决跨域难题:构建高效PHP CORS响应的8步法则在现代Web开发中,前后端分离架构已成为主流,而跨域资源共享(CORS)问题也随之成为高频痛点。PHP作为服务端常用语言,合理配置CORS响应头…

作者头像 李华
网站建设 2026/10/15 12:34:54

为什么顶尖公司都在做PHP日志集中管理?真相令人震惊

第一章:为什么顶尖公司都在做PHP日志集中管理?在现代分布式系统架构中,PHP应用往往部署在多个服务器或容器中,传统的分散式日志存储方式已无法满足高效运维与故障排查的需求。顶尖科技公司纷纷采用日志集中管理策略,以…

作者头像 李华