我试图创建一个测试,我试图强制一个竞争条件(或至少增加其发生的可能性),我已经使用了CountDownLatch
.
问题是我得到了java.lang.IllegalMonitorStateException
我的CountDownLatch.wait()
.我肯定在滥用它CountDownLatch
,我肯定不会以聪明的方式创建这个测试.
这个简单的代码再现了我的想法和我的问题(我也有一个要点):
import java.util.*; import java.util.concurrent.*; public class Example { private static BusinessLogic logic; public static void main(String[] args) { final Integer NUMBER_OF_PARALLEL_THREADS = 10; CountDownLatch latch = new CountDownLatch(NUMBER_OF_PARALLEL_THREADS); logic = new BusinessLogic(); // trying to force the race condition Listthreads = new ArrayList (NUMBER_OF_PARALLEL_THREADS); for (int i=0; i 如果当前线程不是对象监视器的所有者,则抛出
CountDownLatch.wait()
状态的javadocIllegalMonitorStateException
.但我担心我不明白这是什么意思,我也无法想象如何重新创建我的代码以避免这种异常.编辑:通过答案中提供的提示,我已经创建了上述示例的新版本,并且我已经存储在这个要点中.我现在没有任何例外.
1> hearnden..:试试
await()
,不是wait()
.
await()
将等到闩锁达到零.wait()
与锁存器无关,而不是你想要的WorkerRunnable
.但是,仅供参考,为了在wait()
不获得异常的情况下进行调用,您必须拥有对象的监视器,并且要成为所有者,您必须处于synchronized
该对象的块中.