什么是 synchronized?
synchronized 是 Java 语言提供的关键字,用于实现线程同步,确保多个线程在访问共享资源时不会发生数据竞争或不一致的问题。
使用方式
- 同步方法:在方法声明前加上
synchronized,锁住当前实例(或类对象,如果是静态方法)。 - 同步代码块:使用
synchronized(object) { ... }显式指定锁对象,粒度更细,性能更优。
底层原理
synchronized 基于 JVM 的 Monitor(监视器)机制实现。每个对象都有一个与之关联的 monitor,当线程进入 synchronized 代码块时,会尝试获取该 monitor 的所有权。
在 JDK 6 之后,JVM 对 synchronized 进行了大量优化,包括偏向锁、轻量级锁和重量级锁的升级机制,显著提升了性能。
注意事项
- 避免在 synchronized 块中执行耗时操作,防止阻塞其他线程。
- 尽量缩小同步范围,提高并发效率。
- 不要对 String、Integer 等不可变对象或常量池中的对象加锁,可能导致意外的全局锁。
示例代码
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}