返回
管程里的条件变量:notify() 和 notifyAll() 的本质差异
Android
2024-02-01 00:50:46
管程中的条件变量
管程中的条件变量是一个同步原语,它允许线程在满足某些条件时继续执行。条件变量通常与锁一起使用,以确保对共享数据的访问是同步的。
条件变量有两个主要操作:
- wait(): 将当前线程置于等待状态,直到条件变量被唤醒。
- signal(): 唤醒一个正在等待该条件变量的线程。
- signalAll(): 唤醒所有正在等待该条件变量的线程。
notify() 和 notifyAll() 的区别
notify() 和 notifyAll() 都可以唤醒正在等待条件变量的线程,但它们之间存在一些关键差异:
- notify(): 唤醒一个正在等待该条件变量的线程。如果有多个线程正在等待该条件变量,则随机选择一个线程被唤醒。
- notifyAll(): 唤醒所有正在等待该条件变量的线程。
何时使用 notify() 和 notifyAll()
notify() 和 notifyAll() 都可以用于线程同步,但它们适用于不同的情况。
- notify(): 当只有一个线程需要被唤醒时,可以使用 notify()。
- notifyAll(): 当需要唤醒所有正在等待条件变量的线程时,可以使用 notifyAll()。
示例
以下是一个使用条件变量的示例:
public class ConditionVariableExample {
private final Lock lock = new ReentrantLock();
private final ConditionVariable condition = lock.newCondition();
public void produce() {
lock.lock();
try {
// 生产产品
while (buffer is full) {
condition.await();
}
buffer.add(product);
condition.signal();
} finally {
lock.unlock();
}
}
public void consume() {
lock.lock();
try {
// 消费产品
while (buffer is empty) {
condition.await();
}
product = buffer.remove();
condition.signal();
} finally {
lock.unlock();
}
}
}
在这个示例中,生产者线程使用 condition.await() 方法等待缓冲区中有空间可用,然后生产产品并使用 condition.signal() 方法唤醒消费者线程。消费者线程使用 condition.await() 方法等待缓冲区中有产品可用,然后消费产品并使用 condition.signal() 方法唤醒生产者线程。
结论
管程中的条件变量是一个强大的同步工具,可以用于实现各种同步场景。notify() 和 notifyAll() 都可以用于唤醒正在等待条件变量的线程,但它们适用于不同的情况。