synchronized 是 Java 中用于实现线程同步的关键字,主要作用是保证同一时刻只有一个线程可以执行某段代码或访问某个方法,从而避免多线程并发带来的数据不一致问题。
下面从 是什么、怎么用、底层原理、常见注意点 四个方面说明。
synchronized 是 Java 的内置锁机制,用来实现:
它是 悲观锁,也是 可重入锁。
public synchronized void method() {
// 同一时刻只能有一个线程访问这个方法
}
thispublic static synchronized void method() {
// 锁的是当前类的 Class 对象
}
类名.classsynchronized (lockObject) {
// 临界区代码
}
✅ 最推荐的方式,粒度更细、更灵活
每个 Java 对象在内存中都有:
synchronized 本质:
对对象头中的 Mark Word 进行操作,获取 Monitor 锁
synchronized(obj) {
...
}
编译后会有:
monitorentermonitorexitJVM 保证:
synchronized 不是一开始就“很重”,而是逐步升级:
无锁
↓
偏向锁(只有一个线程)
↓
轻量级锁(少量竞争,CAS)
↓
重量级锁(真正阻塞线程)
✅ 大幅提升了性能
synchronized void a() {
b();
}
synchronized void b() {
// 同一线程可以再次进入
}
ReentrantLock 的重要区别tryLock| 对比项 | synchronized | ReentrantLock |
|---|---|---|
| 用法 | 简单 | 灵活 |
| 可中断 | ❌ | ✅ |
| 尝试获取锁 | ❌ | ✅ |
| 公平锁 | ❌ | ✅ |
| 性能 | 已优化 | 略优(复杂场景) |
✅ 推荐使用场景:
✅ 示例:
private int count = 0;
public void increment() {
synchronized (this) {
count++;
}
}
synchronized 是 Java 内置的同步机制,通过对象锁保证线程安全,底层依赖对象头和 Monitor,经过锁升级优化后性能已非常优秀。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。