推荐答案
synchronized 关键字在 Java 中用于实现线程同步,确保多个线程在访问共享资源时的线程安全。它可以修饰方法或代码块,使得同一时间只有一个线程能够执行被 synchronized 修饰的代码。
本题详细解读
1. synchronized 的作用
synchronized 关键字的主要作用是防止多个线程同时访问共享资源,从而避免数据不一致的问题。它可以确保在同一时间只有一个线程能够执行被 synchronized 修饰的代码,其他线程必须等待当前线程执行完毕后才能进入。
2. synchronized 的使用方式
synchronized 可以用于修饰实例方法、静态方法或代码块。
2.1 修饰实例方法
当 synchronized 修饰实例方法时,锁对象是当前实例对象(this)。多个线程访问同一个实例对象的同步方法时,会互斥执行。
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
}2.2 修饰静态方法
当 synchronized 修饰静态方法时,锁对象是当前类的 Class 对象。多个线程访问同一个类的静态同步方法时,会互斥执行。
public class Counter {
private static int count = 0;
public static synchronized void increment() {
count++;
}
}2.3 修饰代码块
synchronized 还可以修饰代码块,锁对象可以是任意对象。通过指定锁对象,可以实现更细粒度的同步控制。
// www.javascriptcn.com code example
public class Counter {
private int count = 0;
private final Object lock = new Object();
public void increment() {
synchronized (lock) {
count++;
}
}
}3. synchronized 的实现原理
synchronized 是基于 Java 对象头中的监视器锁(Monitor)实现的。当一个线程进入 synchronized 代码块时,它会尝试获取锁对象的监视器锁。如果锁被其他线程持有,当前线程会进入阻塞状态,直到锁被释放。
4. synchronized 的优缺点
4.1 优点
- 简单易用,Java 语言原生支持。
- 自动释放锁,避免死锁问题。
4.2 缺点
- 性能开销较大,尤其是在高并发场景下。
- 无法中断一个正在等待锁的线程。
- 无法尝试获取锁而不阻塞。
5. 使用场景
synchronized 适用于以下场景:
- 需要简单实现线程同步。
- 对性能要求不高,或者同步代码块执行时间较短。
- 需要确保多个线程对共享资源的互斥访问。