这是个读者写者程序~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;@Overridepublicvoidrun(){while(true&&i=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的情况了,但是会死锁,执行不完,,彻底晕了,求解救~~
2 回答
桃花长相依
TA贡献1860条经验 获得超8个赞
writeSomething是一个synchronized方法,代表这个方法进入的时候会加锁,也就是说只要writeSomething不返回,所有其它writeSomething和readSometing都得等着,结果你又在writeSomething里面wait,所以就死锁了。对于reader/writer问题,你需要的其实不是读写锁,而是信号量或者条件变量。
Qyouu
TA贡献1786条经验 获得超11个赞
"问题在与,仓库最大容量为100,这种情况下会超过100"--应该是多个写者会相互唤醒.你把wait放在while里试试:Inotherwords,waitsshouldalwaysoccurinloops,likethisone:synchronized(obj){while() obj.wait(timeout);...//Performactionappropriatetocondition}如果一个写者被另一个写者唤醒,当前的arraylist的size可能还是100.如果没有while,这个写者接着会把size增为101.
添加回答
举报
0/150
提交
取消