读者写者问题的模拟出现java.lang.IllegalMonitorStateException异常
下面是对读者写者问题的模拟,但是运行时,总是出现java.lang.IllegalMonitorStateException异常。检查是notify和wait两个语句的问题。虽然将wait和notify都放在synchronized(){}中,可以消除异常,但是程序无法正常终止,似乎是出现了死锁。但是将wait不放在synchronized(){}中,虽然程序可以运行完成,但会出现上述异常。部分代码如下:
请各位帮我看看》》》
class Writer extends Thread{
private Resource resource;
private int id; //读者进程id
public Writer(Resource resource, int id){
this.id = id;
this.resource = resource;
}
public void run(){
try{
resource.decreWmutex();
if(resource.getWmutex() < 0){ //如果wmutex已被某writer或reader进程占据,等待
System.out.println("写进程" + this.id + "被阻塞!");
wait();
}else{
System.out.println("写进程" + this.id + "正在操作!");
Thread.sleep(300);//正在访问时间
}
}catch(Exception e){
e.printStackTrace();
}finally{
resource.increWmutex();
System.out.println("写进程" + this.id + "操作完毕!");
synchronized(this){
notifyAll();
} //notifyAll();
}
}
}
class Reader extends Thread{
private Resource resource;
private int id;
public Reader(Resource resource, int id){
this.resource = resource;
this.id = id;
}
public void run(){
try{
resource.decreRmutex();
if(resource.getRmutex() < 0){
System.out.println("读进程" + this.id + "被阻塞!未进入");
wait();
}else{
if(resource.getReadercount() == 0){//如果是0,判断有没有写进程在里面。
resource.decreWmutex();
if(resource.getWmutex() < 0){
System.out.println("读进程" + this.id + "被阻塞!");
wait();
}
}
resource.increReadercount(); //增加一个reader进程
resource.increRmutex();//释放rmutex;
System.out.println("读进程" + this.id + "进入!" + "当前进程数是" + resource.getReadercount());
Thread.sleep(100);//模仿正在访问时间
resource.decreRmutex();//重新访问rmutex
if(resource.getRmutex() < 0){
System.out.println("读进程" + this.id + "被阻塞!未出来");
wait();
}else{
resource.decreReadercount();
if(resource.getReadercount() == 0) //如果,没有reader进程在里面,唤醒writer进程
resource.increWmutex();
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
resource.increRmutex();//释放rmutex
System.out.println("读进程" + this.id + "操作完毕!" + "当前进程数是" + resource.getReadercount());
//notifyAll();
synchronized(this){
notifyAll();
}
}
}
}
public class RWProblem {
public static void main(String args[]){
Resource resource = new Resource();
//定义2个写者进程
for(int i = 0; i < 2; i++){
Thread t = new Writer(resource, i);
t.start();
}
//定义5个读者进程
for(int i = 0; i < 5; i++){
Thread t = new Reader(resource, i);
t.start();
}
}
}请各位帮我看看》》》
...全文


Java SE
