本文内容主要是关于单生产者单消费者模式中,容易忘的,致使出现的错误解决:
一、问题描述
当启动主线程,预备实现生产者和消费者两个线程交替对同个数据进行操作的时候,编译可以通过,但是运行阶段出现了异常----IllegalMonitorStateException。
1、看控制台错误描述:
2、错误解决思路:
找所有“Excepion in ...”的语句,看里边的错误位置定位在哪。----错误的方法的出现位置是在notify和wait方法应用于在Project这个类里的produce方法和consume方法里边。
定位先去到Project类的produce方法里边。
仔细一看:原因竟然是因为自己又忘了Object的等待唤醒机制中要用到的wait/notify/notifyAll方法,都必须是在同步的环境当中使用 ,如果不是在同步环境中,使用就会出现非法监测异常。
二、代码修改
既然已经知道了问题的出现原因就是没有给wait和notifyAll方法同步的环境,那就调整一下之前自己写的同步代码段,改用同步方法,扩大一下同步锁的作用范围。
三、小结:
1、Object的notify/notifyAll/wait方法都必须是在同步环境当中使用;
2、在使用Object的notify/notifyAll/wait的时候,必须是要自己持有的锁标记才可以做这个动作,否则也会出现IllegalMonitorStateException;
3、出现报错不要慌张,不要着急去翻代码,一步一步去找控制台当中报的Exception in....,去找到问题出现的位置,再解决问题。