温馨提示×

温馨提示×

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

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

为何要用 Synchronized 同步

发布时间:2026-10-06 10:37:49 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

在 Java 中之所以要用 synchronized 来做同步,核心原因只有一个:保证多线程环境下的数据安全与程序正确性。

下面从“问题 → 原因 → 作用”三个层次说明。


一、为什么会出现问题(背景)

在多线程程序中:

  • 多个线程 共享同一块内存(堆内存)
  • 多个线程可能 同时读写同一个变量或对象

例如:

int count = 0;

void add() {
    count++;   // 非原子操作
}

count++ 实际包含三步:

  1. 读取 count
  2. 计算 count + 1
  3. 写回 count

如果多个线程同时执行,就可能出现:

  • 丢失更新
  • 数据不一致
  • 程序结果不可预测

这就是 线程安全问题。


二、为什么要用 synchronized(核心原因)

1️⃣ 保证原子性

synchronized 能把一段代码变成原子操作:

synchronized (this) {
    count++;
}

同一时刻,只有一个线程能进入同步块。


2️⃣ 保证可见性

线程对变量的修改,对其他线程立即可见。

  • 进入 synchronized:从主内存重新读取
  • 退出 synchronized:把修改刷回主内存

避免线程看到“旧值”。


3️⃣ 保证有序性

防止 JVM 或 CPU 的指令重排序破坏逻辑顺序。


三、synchronized 能解决什么典型问题

✅ 1. 竞态条件(Race Condition)

多个线程竞争同一资源导致结果错误。

✅ 2. 数据不一致

如:

  • 账户余额错误
  • 库存超卖
  • 计数器不准

✅ 3. 对象状态被破坏

例如:

  • 链表结构错乱
  • 单例被创建多次

四、不使用 synchronized 会怎样?

可能出现:

  • 计算结果错误
  • 偶发性 Bug(很难复现)
  • 线上事故(金融、交易系统尤其危险)

五、什么时候“必须”用 synchronized?

✅ 满足以下任意一点通常就需要:

  • 多个线程访问 共享可变状态
  • 操作不是原子的
  • 读和写交织进行

六、补充说明

  • synchronized 是 重量级但安全 的方案
  • JDK 1.6 后已做大量优化(锁升级)
  • 也可用:
    • ReentrantLock
    • volatile(仅可见性)
    • 并发容器(ConcurrentHashMap)

一句话总结

使用 synchronized,是为了在多线程环境中,防止数据竞争,保证程序结果正确、稳定、可预测。

如果你愿意,我也可以结合具体场景 / 源码 / 面试角度再讲一版。

向AI问一下细节

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

AI
助
手