Java 中 synchronized 关键字的作用是什么?

· 约 3 分钟读完 · 第 60 / 274 章

推荐答案

synchronized 关键字在 Java 中用于实现线程同步,确保多个线程在访问共享资源时的线程安全。它可以修饰方法或代码块,使得同一时间只有一个线程能够执行被 synchronized 修饰的代码。

本题详细解读

1. synchronized 的作用

synchronized 关键字的主要作用是防止多个线程同时访问共享资源,从而避免数据不一致的问题。它可以确保在同一时间只有一个线程能够执行被 synchronized 修饰的代码,其他线程必须等待当前线程执行完毕后才能进入。

2. synchronized 的使用方式

synchronized 可以用于修饰实例方法、静态方法或代码块。

2.1 修饰实例方法

当 synchronized 修饰实例方法时,锁对象是当前实例对象(this)。多个线程访问同一个实例对象的同步方法时,会互斥执行。

2.2 修饰静态方法

当 synchronized 修饰静态方法时,锁对象是当前类的 Class 对象。多个线程访问同一个类的静态同步方法时,会互斥执行。

2.3 修饰代码块

synchronized 还可以修饰代码块,锁对象可以是任意对象。通过指定锁对象,可以实现更细粒度的同步控制。

3. synchronized 的实现原理

synchronized 是基于 Java 对象头中的监视器锁(Monitor)实现的。当一个线程进入 synchronized 代码块时,它会尝试获取锁对象的监视器锁。如果锁被其他线程持有,当前线程会进入阻塞状态,直到锁被释放。

4. synchronized 的优缺点

4.1 优点

  • 简单易用,Java 语言原生支持。
  • 自动释放锁,避免死锁问题。

4.2 缺点

  • 性能开销较大,尤其是在高并发场景下。
  • 无法中断一个正在等待锁的线程。
  • 无法尝试获取锁而不阻塞。

5. 使用场景

synchronized 适用于以下场景:

  • 需要简单实现线程同步。
  • 对性能要求不高,或者同步代码块执行时间较短。
  • 需要确保多个线程对共享资源的互斥访问。