MST

星途 面试题库

面试题:Java多线程编程中条件变量的基础应用

在Java多线程编程中,简述条件变量(Condition)相较于传统wait/notify机制的优势,并举例说明如何使用Condition实现线程间的协作,要求写出关键代码片段。
16.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

优势

  1. 更细粒度的控制:传统的wait/notify机制是基于对象的监视器,一个对象只能有一个等待队列。而Condition可以为每个对象创建多个等待队列,允许线程在不同条件下等待和唤醒,实现更细粒度的线程控制。
  2. 灵活性更高Condition提供了更丰富的方法,如awaitUninterruptibly(不响应中断等待)、signalAll(唤醒所有等待在该条件上的线程)等,能满足更复杂的线程协作场景。
  3. 性能优化:在某些场景下,通过Condition可以减少不必要的线程唤醒,提高系统性能。

关键代码示例

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ConditionExample {
    private final Lock lock = new ReentrantLock();
    private final Condition condition = lock.newCondition();
    private boolean flag = false;

    public void producer() throws InterruptedException {
        lock.lock();
        try {
            while (flag) {
                condition.await();
            }
            // 生产数据的逻辑
            System.out.println("Producing data...");
            flag = true;
            condition.signalAll();
        } finally {
            lock.unlock();
        }
    }

    public void consumer() throws InterruptedException {
        lock.lock();
        try {
            while (!flag) {
                condition.await();
            }
            // 消费数据的逻辑
            System.out.println("Consuming data...");
            flag = false;
            condition.signalAll();
        } finally {
            lock.unlock();
        }
    }
}

在上述代码中,producer方法和consumer方法通过Condition实现了线程间的协作。producer在数据已存在时等待,生产完数据后唤醒consumerconsumer在数据不存在时等待,消费完数据后唤醒producer