关于这个异常,实在没什么可说的,就是因为没有先获得某个对象的同步锁却调用了这个对象的wait/notify(all)线程方法而引起的。
上面不是主要的,主要的是我在写代码时一些顺嘴逻辑完全有可能会导致这种错误,而且往往还很难察觉到。
就好比这次的代码,逻辑是这样的:启动几个线程同时去查找某个东西,找到后将位置记录在position中然后唤醒等待的主线程进行之后的任务。
逻辑很明确,非常顺嘴。于是我为了方便,就采用了位置对象的同步锁进行主线程的等待,同时在那些子线程中用位置对象唤醒主线程。
这是顺嘴的写法:
synchronized (SearchData.position) {
SearchData.position =position;
SearchData.position.notifyAll();
}
一运行,直接GameOver了。
然后脑子就乱了,短路似的怎么也想不明白这是什么情况。
喝了一口茶之后,脑子里终于来电了,悄悄的 alt+down ,心里默默给了自己一个嘴巴。
synchronized (SearchData.position) {
SearchData.position.notifyAll();
SearchData.position =position;
}
真Shit啊,尼玛position都被换掉了,还notifyAll()个屁啊!
---------------------------------------------------------------------------------
记录下这些点点滴滴,其实也是一种生活的态度。呵呵,对自己说:晚安吧,亲。