使用ReentrantLock的Condition调用signalAll后线程未唤醒原因求助
问题根因
- 核心错误:
Start类main方法中调用t1.resume()时,实际调用的是Thread父类自带的废弃resume方法,而非你自己实现的resumeThread业务方法。这就导致t1实例的paused标记永远不会被修改为false,就算condition.signalAll()唤醒了等待队列中的所有线程,pause方法内的while(current.paused)判断会一直成立,线程会再次进入等待状态,表面看就是signalAll()完全没生效。 - 潜在隐患:
Task类的paused成员变量在run方法中赋值时没有处于锁保护范围,虽然当前场景下后续的lock.lock()操作会保证变量可见性,但如果有其他场景直接修改paused会出现多线程可见性问题。
修复方案
- 把
main方法中的t1.resume()修改为t1.resumeThread()即可解决核心问题,两个线程都能正常被唤醒。 - 建议给
paused变量增加volatile修饰,进一步避免多线程可见性问题:
public volatile boolean paused = false;
- 可选优化:
Task类尽量不要直接继承Thread,改为实现Runnable接口,降低代码耦合度。
内容的提问来源于stack exchange,提问作者Razor
相关产品推荐
相关产品推荐

