Java中能否创建Condition变量数组?如何初始化该数组?
在Java中创建Condition变量数组的方法
当然可以在Java中创建Condition类型的数组!你想用多个Condition实现Monitor的思路完全合理,这是多线程同步场景里很常用的做法。
针对你给出的代码,初始化Condition[] self的核心要点是:每个Condition实例都必须通过你已声明的lock对象的newCondition()方法创建——因为Condition是和特定Lock绑定的,只有这样才能保证后续调用await()、signal()等方法时,能和锁正确交互完成同步逻辑。
具体初始化步骤
- 先确定你需要的Condition数量(可以是固定常量,也可以动态传入)
- 创建Condition数组对象
- 遍历数组,给每个元素赋值为
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.
相关产品推荐
相关产品推荐

