怎样3分钟搞定Office全家桶:新手也能掌握的自动化部署助手
2026/8/12 20:06:38
synchronized是 Java 提供的最基础、最核心的线程同步机制,用来保证多线程环境下的互斥访问和可见性。
虽然简单易用,但其背后的锁原理(Monitor)、对象头(Mark Word)、锁升级(偏向锁→轻量级锁→重量级锁)等概念极其重要,也是面试高频考点。
synchronized解决两个问题:publicsynchronizedvoidtest(){// 临界区}等价于:
publicvoidtest(){synchronized(this){// 临界区}}特点:
publicstaticsynchronizedvoidtest(){// 临界区}等价于:
synchronized(MyClass.class){// 临界区}特点:
Objectlock=newObject();synchronized(lock){// 临界区}特点:
Java 中,每一个对象都可以作为锁,因为:
Java 的锁不是一开始就用重量级锁,而是逐步升级,以提升性能。
| 锁类型 | 特点 | 适用场景 |
|---|---|---|
| 无锁 | 无竞争 | 单线程 |
| 偏向锁 | 无需 CAS,完全无竞争 | 同一线程反复进入 |
| 轻量级锁 | 使用 CAS,自旋 | 少量竞争 |
| 重量级锁 | 阻塞/唤醒,最慢 | 竞争激烈 |
⚠️注意事项:
当一个线程释放锁时,JVM 会做两件事:
因此保证:
synchronized是可重入锁:
同一线程可以多次获得同一把锁不会死锁。
publicsynchronizedvoida(){b();// 可以再次获得同一把锁}publicsynchronizedvoidb(){// ...}| 对比 | synchronized | volatile |
|---|---|---|
| 可见性 | ✔有 | ✔有 |
| 原子性 | ✔有(加锁) | ❌没有 |
| 是否阻塞 | ✔会阻塞 | ❌不阻塞 |
| 用途 | 多个操作的原子性 | 单变量读写 |
| 底层 | Monitor、锁升级 | 内存屏障、禁止指令重排 |
volatile 解决可见性,synchronized 解决原子性 + 可见性。
✔优点
✔缺点
| 特性 | synchronized | Lock |
|---|---|---|
| 锁的释放 | 自动释放 | 必须 unlock() |
| 可中断 | ❌ | ✔ |
| 可尝试 | ❌ | ✔(tryLock) |
| 公平锁 | ❌ | ✔ |
| 条件队列 | ❌ | ✔(Condition) |
| 性能 | 被优化后差别不大 | 更灵活,高并发优势明显 |
建议 1:优先使用 synchronized(JDK 8 性能已非常好)
建议 2:优先锁代码块,而不是锁整个方法
建议 3:锁对象要私有,避免被外部使用
privatefinalObjectlock=newObject();建议 4:避免锁住字符串常量(共享跨 ClassLoader)
synchronized("LOCK"){}// ❌ 千万不要这样写参考资料
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码-知乎
synchronized - 指南 - ljbguanli - 博客园