多线程【读者写者】问题

这是个读者写者程序~
publicclassMain{
Factoryfa=newFactory();
//主程序
publicstaticvoidmain(String[]args){
Mainmm=newMain();
Writerwriter=mm.newWriter();
newThread(writer).start();
newThread(writer).start();
newThread(mm.newReader()).start();
}
//写者
classWriterimplementsRunnable{
intmax=1000;//总共写1000次
inti=0;
@Override
publicvoidrun(){
while(true&&ifa.writeSomething();
++i;
}
}
}
//读者
classReaderimplementsRunnable{
@Override
publicvoidrun(){
while(true){
fa.readSomething();
}
}
}
classFactory{
Listrepo=newArrayList();//仓库
intmax=100,min=0,isn=0;//仓库最大值、最小值、图书编号
//写
publicsynchronizedvoidwriteSomething(){
if(repo.size()==max){
try{
this.wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"-write:"
+isn+"/Size:"+repo.size());
repo.add(newInteger(isn++));
this.notify();
}
//读
publicsynchronizedvoidreadSomething(){
if(repo.size()==min){
try{
this.wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"-read:"
+repo.get(0));
repo.remove(0);
this.notifyAll();
}
}
}
一个写者,多个读者的时候这个程序是没问题的
多个写者,一个读者的时候就出问题了,问题在与,仓库最大容量为100,这种情况下会超过100,我感觉问题出在多个写者会相互唤醒,不知道我分析的对不对,所以改了一下writeSomething(),如下:
//写
publicsynchronizedvoidwriteSomething(){
if(repo.size()>=max){
try{
this.wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}else{
System.out.println(Thread.currentThread().getName()+"-write:"
+isn+"/Size:"+repo.size());
repo.add(newInteger(isn++));
this.notify();
}
}
这样的确不会出现容量超过100的情况了,但是会死锁,执行不完,,彻底晕了,求解救~~
慕村9548890
浏览 427回答 2
2回答

桃花长相依

writeSomething是一个synchronized方法,代表这个方法进入的时候会加锁,也就是说只要writeSomething不返回,所有其它writeSomething和readSometing都得等着,结果你又在writeSomething里面wait,所以就死锁了。对于reader/writer问题,你需要的其实不是读写锁,而是信号量或者条件变量。

Qyouu

"问题在与,仓库最大容量为100,这种情况下会超过100"--应该是多个写者会相互唤醒.你把wait放在while里试试:Inotherwords,waitsshouldalwaysoccurinloops,likethisone:synchronized(obj){while()obj.wait(timeout);...//Performactionappropriatetocondition}如果一个写者被另一个写者唤醒,当前的arraylist的size可能还是100.如果没有while,这个写者接着会把size增为101.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript