解决方案 »

  1.   

    我运行了一下你的代码,有两个else的时候,不是死锁问题。虽然只运行打印出一条语句,可是程序运行完了,没有死锁。你的程序是这样运行的1.先生产者运行了第一个else{}因为flag=true,当执行完else块。flag=false的时候,这个时候,for()又调用set方法,这个时候就进入了set的if(){}块中,这个时候就等待线程来唤醒它。而且它已经释放资源。这个时候,get方法得到资源,执行这个时候flag=false的,这个没有异议吧!!这个时候,就就打印了一条记录出来了。然后就执行了flag=true的赋值,这个大家没有什么异议吧。不过问题就来了,super.nofity()大家以为这样就唤醒了生产者的set里面那个中断在if(){}块中的的那个线程,的确他是唤醒了它,可是,他还没有得到cpu的资源,所以他还要等一段时间。这个时候,get()又被执行了一次,这个时候flag=true的,这个大家可以理解吧!所以就会在get()方法的if(){}块中中断消费。这个时候,set里面的方法才被唤醒,然后执行flag=flag操作而且也nofity(),notify()方法和刚才的一样,是会唤醒消费者的get()块中中断的在if()块的方法,但是,他没有那么快得到资源,所以线程还是在继续调用set方法,这个时候flag=false,没有意见吧,这个时候,又在set的if()块中中断线程,这个时候。消费者终于得到资源,等了老半天,然后执行在if()块中中断段的程序,然后又执行了flag=true的操作,然后有nofity(),记得nofity()是唤醒了线程,不过线程还要得到资源。所以for在调用get的方法的时候,flag=true,然后就是继续中断消费者。希望对你有帮助。多看几遍,就明白我的意思了。谢谢