温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

volatile和synchronized区别

发布时间:2026-10-29 13:51:05 来源:亿速云 阅读:92 作者:小樊 栏目:编程语言

在 Java 并发编程中,volatile 和 synchronized 都用于保证多线程环境下的可见性,但它们的作用范围、语义和能力有明显区别。


一、核心区别概览

对比项 volatile synchronized
原子性 ❌ 不保证 ✅ 保证
可见性 ✅ 保证 ✅ 保证
有序性 ✅ 有限保证(禁止指令重排) ✅ 保证
是否阻塞线程 ❌ 不会 ✅ 会(重量级)
作用范围 变量 方法 / 代码块
使用复杂度 简单 较复杂

二、volatile 详解

1️⃣ 保证可见性

一个线程修改了 volatile 变量,其他线程立即可见。

volatile boolean flag = false;

2️⃣ 禁止指令重排序

常用于双重检查单例:

private static volatile Singleton instance;

3️⃣ 不保证原子性

❌ 错误示例:

volatile int count = 0;

// 多线程执行
count++;

count++ 不是原子操作,仍可能出问题。

✅ 正确做法:

AtomicInteger count = new AtomicInteger();

三、synchronized 详解

1️⃣ 保证原子性

同一时刻只有一个线程执行同步代码。

synchronized (this) {
    count++;
}

2️⃣ 保证可见性 + 有序性

进入同步块:

  • 清空工作内存
  • 从主内存重新读取

退出同步块:

  • 强制写回主内存

3️⃣ 会阻塞线程

  • 未获取锁的线程会等待
  • 性能开销较大(但 JDK 已优化)

四、典型使用场景对比

✅ 用 volatile 的场景

  • 状态标志(如停止线程)
  • 单次赋值、读操作
  • 配合双重检查锁
volatile boolean running = true;

✅ 用 synchronized 的场景

  • 复合操作(i++、检查再执行)
  • 临界资源保护
  • 需要原子性

五、一句话总结

volatile 是轻量级的“可见性工具”,synchronized 是重量级的“原子+可见+有序”锁。

如果你愿意,我也可以:

  • 用 代码示例对比
  • 讲 JMM 内存模型原理
  • 或结合 面试问答形式 解释
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手