0

0

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

星降

星降

发布时间:2025-11-09 08:42:03

|

628人浏览过

|

来源于php中文网

原创

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 之后引入了偏向锁、轻量级锁等优化,性能已有大幅提升。

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

4. 性能影响不同

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

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

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

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

366

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.30

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

366

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.30

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

75

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

376

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

28

2026.01.21

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号