问题描述
packagej;publicclassTest{publicstaticvoidmain(String[]arguments){SyncStackss=newSyncStack();producersp=newproducers(ss);consumersc=newconsumers(ss);Threadt1=newThread(p);Threadt2=newThread(c);t1.start();t2.start();}}classWotou{intid;publicWotou(intid){this.id=id;}publicStringtoString(){return"Wotou:"+id;}}classSyncStack{intindex=0;Wotouwt;Wotou[]attWotou=newWotou[6];publicvoidpush(Wotouwt){synchronized()***************{if(index==attWotou.length){try{this.wait();}catch(Exceptione){e.printStackTrace();}}this.notify();attWotou[index]=wt;index++;}}publicWotoupop(){synchronized()****************{if(index==0){try{this.wait();}catch(Exceptione){e.printStackTrace();}}this.notify();index--;returnattWotou[index];}}}classproducersimplementsRunnable{Wotouwt;SyncStackss;publicproducers(SyncStackss){this.ss=ss;}publicvoidrun(){for(inti=0;i<20;i++){Wotouwt=newWotou(i);ss.push(wt);System.out.println("生产了:"+wt);try{Thread.sleep(1000);}catch(Exceptione){e.printStackTrace();}}}}classconsumersimplementsRunnable{Wotouwt;SyncStackss;publicconsumers(SyncStackss){this.ss=ss;}publicvoidrun(){for(inti=0;i<20;i++){Wotouwt=ss.pop();System.out.println("消费了:"+wt);try{Thread.sleep(1000);}catch(Exceptione){e.printStackTrace();}}}}我想请问一下,在我两行*****号的那个地方synchronized()里面应该添什么啊?如果添this,但是他俩分别属于不同的函数啊,对象不一样啊,不是同一把锁啊,
解决方案
解决方案二:
没仔细看代码细节,如果楼主是要达到同步目的话,那么申请一个公共对象如:Objectobj=newObject();然后两个synchronized(obj)就可以了。PS:下次把代码格式化会更有可读性哦
解决方案三:
synchronzed锁住的是当前对象,防止其他线程访问当前对象(阻止重执行synchonred部分的代码),那个地方应该用this/
解决方案四:
this也好别的也好,都是一个关卡而已。最好是使用reentrantlock清除明白