You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中能否创建Condition变量数组?如何初始化该数组?

在Java中创建Condition变量数组的方法

当然可以在Java中创建Condition类型的数组!你想用多个Condition实现Monitor的思路完全合理,这是多线程同步场景里很常用的做法。

针对你给出的代码,初始化Condition[] self的核心要点是:每个Condition实例都必须通过你已声明的lock对象的newCondition()方法创建——因为Condition是和特定Lock绑定的,只有这样才能保证后续调用await()、signal()等方法时,能和锁正确交互完成同步逻辑。

具体初始化步骤

  1. 先确定你需要的Condition数量(可以是固定常量,也可以动态传入)
  2. 创建Condition数组对象
  3. 遍历数组,给每个元素赋值为lock.newCondition()的返回实例

固定长度数组示例

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

public class CustomMonitor {
    private static final int CONDITION_COUNT = 3; // 假设需要3个Condition实例
    private Lock lock = new ReentrantLock();
    final Condition[] self;

    // 在构造方法中完成数组初始化
    public CustomMonitor() {
        self = new Condition[CONDITION_COUNT];
        for (int i = 0; i < self.length; i++) {
            self[i] = lock.newCondition();
        }
    }

    // 示例:使用指定Condition的等待方法
    public void awaitOnCondition(int index) throws InterruptedException {
        lock.lock();
        try {
            self[index].await();
        } finally {
            lock.unlock();
        }
    }
}

动态长度数组示例

如果需要根据业务场景动态指定Condition数量,可以把长度作为构造参数传入:

public CustomMonitor(int conditionCount) {
    if (conditionCount <= 0) {
        throw new IllegalArgumentException("Condition数量必须大于0");
    }
    self = new Condition[conditionCount];
    for (int i = 0; i < self.length; i++) {
        self[i] = lock.newCondition();
    }
}

关键注意事项

  • 调用Condition的await()、signal()、signalAll()方法前,必须先获取对应的Lock,否则会抛出IllegalMonitorStateException异常,这是多线程同步里很容易踩的坑。
  • 确保所有Condition都由同一个Lock创建,不要混用不同Lock生成的Condition,否则同步逻辑会完全失效。

内容的提问来源于stack exchange,提问作者A.G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:46:06