一、synchronized 的用法
synchronized 关键字用于实现线程同步,确保多个线程在访问共享资源时不会发生数据竞争和不一致的问题。它主要有三种使用方式:
1. 同步实例方法
public synchronized void method() {
// 同步代码
}
- 锁对象是当前实例(
this)。 - 同一个实例的多个线程调用此方法时会互斥。
2. 同步静态方法
public static synchronized void staticMethod() {
// 同步代码
}
- 锁对象是当前类的 Class 对象(如
MyClass.class)。 - 所有实例的线程调用此方法时都会互斥。
3. 同步代码块
synchronized(lockObject) {
// 同步代码
}
- 可以灵活指定锁对象(可以是任意对象)。
- 缩小了同步范围,提高性能。
4. 深入:wait(), notify(), notifyAll()
这三个方法是定义在 Object 类中的本地方法,必须在一个同步代码块或同步方法内(即已经持有该对象的监视器锁)调用,否则会抛出 IllegalMonitorStateException 异常。它们与 synchronized 配合使用,实现线程间的协调(等待/通知机制)。
- wait(): 使当前线程释放其持有的对象锁,并进入等待状态(WAITING),直到其他线程调用该对象的
notify()或notifyAll()方法,或被中断。调用后,线程会释放锁。 - notify(): 随机唤醒一个正在等待该对象锁的线程。被唤醒的线程会从等待池移动到阻塞队列(EntryList)中,等待锁释放后重新竞争锁。
- notifyAll(): 唤醒所有正在等待该对象锁的线程。这些线程都会被移动到阻塞队列中,共同竞争锁。
典型的生产者 - 消费者模式示例:
public class WaitNotifyExample {
private final Object ();
;
InterruptedException {
(lock) {
(!conditionMet) {
lock.wait();
}
System.out.println();
conditionMet = ;
lock.notifyAll();
}
}
InterruptedException {
(lock) {
(conditionMet) {
lock.wait();
}
System.out.println();
conditionMet = ;
lock.notifyAll();
}
}
}

