Java 多线程中的同步关键字
在 Java 中,synchronized 是一个关键字,用于控制多个线程对共享资源的访问,
保证在同一时刻最多只有一个线程可以执行某段代码或方法,从而避免数据竞争和不一致。
synchronized,锁住当前实例(或类对象,如果是静态方法)。synchronized(object) { ... },可指定任意对象作为锁。public synchronized void increment() {
count++;
}
public void safeMethod() {
synchronized (this) {
// 临界区代码
sharedResource.update();
}
}
synchronized 基于 JVM 的 Monitor(监视器锁)实现。
每个 Java 对象都有一个与之关联的 Monitor,当线程进入 synchronized 块时,
会尝试获取该对象的 Monitor;若已被占用,则线程阻塞,直到锁被释放。
在 JDK 6 之后,JVM 对 synchronized 进行了大量优化,包括:
偏向锁、轻量级锁、自旋锁等,大幅提升了性能。
synchronized 块中调用耗时 I/O 或网络操作,以免阻塞其他线程。synchronized 是可重入的,即同一个线程可以多次获取同一把锁。
除了 synchronized,Java 还提供了 ReentrantLock、volatile、
AtomicInteger 等并发工具。它们各有适用场景:
synchronized:语法简洁,自动释放锁,适合大多数同步场景。ReentrantLock:功能更强大(如可中断、超时、公平锁),但需手动释放。volatile:仅保证可见性和禁止指令重排,不保证原子性。