读者写者问题的模拟出现java.lang.IllegalMonitorStateException异常

chenjie19891104 chenjie19891104 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
下面是对读者写者问题的模拟,但是运行时,总是出现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();
}
}

}


请各位帮我看看》》》
...全文
评论 7
收藏 已收藏
分享
返回顶部
chenjie19891104
Java SE 62,620 成员 307,251 内容