问题描述
/*]在进行flag标志判断的时候用的是if,而不是while,如果用while就不会有安全问题,用了,c1,c2两个监视器,按理每次都只唤醒一个对方线程,为什么还会出现安全问题呢*/importjava.util.concurrent.locks.*;classResource{privateStringname;privateintcount=1;privatebooleanflag=false;privateLocklock=newReentrantLock();privateConditionc1=lock.newCondition();privateConditionc2=lock.newCondition();publicvoidset(Stringname){lock.lock();try{if(flag){try{c1.await();}catch(InterruptedExceptione){}}this.name=name+count++;System.out.println(Thread.currentThread().getName()+"....生产者..."+this.name);flag=true;c2.signal();}finally{lock.unlock();}}publicvoidout(){lock.lock();try{if(!flag){try{c2.await();}catch(InterruptedExceptione){}}System.out.println(Thread.currentThread().getName()+"....消费者......."+this.name);flag=false;c1.signal();}finally{lock.unlock();}}}classProducerimplementsRunnable{Resourcer;Producer(Resourcer){this.r=r;}publicvoidrun(){while(true)r.set("烤鸭");}}classConsumerimplementsRunnable{Resourcer;Consumer(Resourcer){this.r=r;}publicvoidrun(){while(true)r.out();}}classProducerConsumerDemo2{publicstaticvoidmain(String[]args){Resourcer=newResource();Producerp=newProducer(r);Consumerc=newConsumer(r);Threadt1=newThread(p);Threadt2=newThread(p);Threadt3=newThread(c);Threadt4=newThread(c);t1.start();t2.start();t3.start();t4.start();}}
解决方案
解决方案二:
楼主要学会贴代码publicclassDemo{publicstaticvoidmain(String[]args){if(args.length==0){System.out.println("noargs.");}}}
像楼主的代码层级多,又没有排版,没法看。
解决方案三:
比如说这样的情形:第一次生产者放东西,OK没问题,第二次生产者放东西,要wait了。现在另一个生产者和二个消费者在竞争,一个消费者得到了锁,执行后让那个等待的生产者复活。现在4个人重新竞争。其中一个生产者(没有wait的那个)得到了锁,执行了一次。这时原则上应该让消费者来了。然而另一个生产者(wait过的那个)又得到了锁,成功执行了一次(从wait()后面开始执行),不进行判断这不安全。------------------------------------------------------------------------------------------------------------有一点不太确定,刚唤醒的线程,不知道是不是比那些没有等待过的线程优先级要高点。