返回

管程里的条件变量:notify() 和 notifyAll() 的本质差异

Android

管程中的条件变量

管程中的条件变量是一个同步原语,它允许线程在满足某些条件时继续执行。条件变量通常与锁一起使用,以确保对共享数据的访问是同步的。

条件变量有两个主要操作:

  • 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() 都可以用于唤醒正在等待条件变量的线程,但它们适用于不同的情况。