为了账号安全,请及时绑定邮箱和手机立即绑定

多线程【读者写者】问题

多线程【读者写者】问题

慕村9548890 2019-04-13 08:46:09
这是个读者写者程序~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问题,你需要的其实不是读写锁,而是信号量或者条件变量。
                            
查看完整回答
反对 回复 2019-04-13
?
Qyouu

TA贡献1786条经验 获得超11个赞

"问题在与,仓库最大容量为100,这种情况下会超过100"
--应该是多个写者会相互唤醒.你把wait放在while里试试:
Inotherwords,waitsshouldalwaysoccurinloops,likethisone:
synchronized(obj){
while()
obj.wait(timeout);
...//Performactionappropriatetocondition
}
如果一个写者被另一个写者唤醒,当前的arraylist的size可能还是100.如果没有while,这个写者接着会把size增为101.
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 426 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信