在Java多线程编程中,synchronized 是一个用于控制线程同步的关键字。它能确保多个线程在访问共享资源时不会发生数据竞争,从而保障程序的线程安全性。
方法级同步:当一个普通方法被声明为 synchronized 时,调用该方法的线程会自动获取当前对象的内置锁(也叫监视器锁)。例如,某电商系统中的库存扣减方法使用 synchronized 修饰,避免多个用户同时下单导致超卖问题。
代码块级同步:开发者也可以使用 synchronized(对象) 的形式对特定代码块加锁。比如在银行转账逻辑中,只对“扣款”和“入账”这两个关键操作加锁,而不是整个方法,这样能提升并发性能。
锁的可重入性:synchronized 支持可重入,即同一个线程可以多次获取同一把锁而不会死锁。例如,一个 synchronized 方法内部调用另一个 synchronized 方法时,不会被阻塞,这是 Java 内置锁的重要特性。
相比其他并发工具(如 ReentrantLock),synchronized 语法简洁、由 JVM 自动管理锁的获取与释放,不易出错。虽然早期版本性能较差,但自 Java 6 起经过大量优化(如偏向锁、轻量级锁等),其性能已大幅提升,在多数业务场景中完全够用。
尽管 synchronized 使用方便,但滥用会导致性能瓶颈。应尽量缩小同步范围,避免在 synchronized 块中执行耗时操作(如网络请求或复杂计算),否则会阻塞其他线程,影响系统吞吐量。