欢迎来到天天文库
浏览记录
ID:35315493
大小:58.50 KB
页数:9页
时间:2019-03-23
《黑马程序员java培训就业班笔记:day13(多线程通信)总结》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Day13总结1、单列设计模式:1、恶汉式:代码体现:ClassSingle{PrivtaestaticfinalSingles=newSingle();PrivateSingle(){}PublicstaticSinglegetInstance(){Returns;}}2、懒汉式:延迟加载,存在着多线程并发访问的安全问题,需要使用同步来解决安全问题,但是同步会降低效率,所以使用双重if()判断形式解决效率低的问题。实现代码:ClassSingle{PrivateSingle(){}PrivatestaticSingles=
2、null;PublicstaticSinglegetInstance(){If(s==null){Synchroinzed(Single.class){If(s==null)S=newSingle();}Returns;}}}2、死锁:即同步的弊端,不是线程和进程没有了,而是不动了。表现形式:同步嵌套的时候,使用的锁不一样,容易引发死锁。实现代码:3、线程间通信:其实就是多个线程在操作同一个资源,但是操作的动作不同,动作不同,意味着线程的任务是不一样的。就需要对任务对象进行单独的封装和描述。4、等待唤醒机制:最重要的机制重点
3、掌握Wait():等待:让当前线程出于冻结状态,当前线程就被存储到线程池当中。Notify();唤醒线程池中的任意一个线程,让该线程恢复到运行状态,会具备CPU的执行资格。notifyAll():唤醒线程池中的所有等待的线程,让它们具备CPU的执行资格。所谓的监视器:就是多线程中的锁。上面几个功能必须在同步当中,要标示清楚它所在的锁。也就说:wait到底让哪个锁上的线程等待了,notify:到底是唤醒了哪个锁上被等待的线程。NotifyAll:用上面的一样。为什么是Object中的方法?因为这些方法都是必须要标识出所属的锁,
4、而锁是任意的对象。能被任意对象调用的方法一定定义在Object类中。一般在使用等待和唤醒时通常都得有标记。代码优化:ResourceDemo3.javaclassResource{privateStringname;privateStringsex;privatebooleanflag=false;publicsynchronizedvoidset(Stringname,Stringsex){if(flag)try{this.wait();}catch(Exceptione){}this.name=name;this.sex
5、=sex;flag=true;this.notify();}publicsynchronizedvoidout(){if(!flag)try{this.wait();}catch(Exceptione){}System.out.println(name+"----"+sex);flag=false;this.notify();}}classInputimplementsRunnable{Resourcer;Input(Resourcer){this.r=r;}publicvoidrun(){intx=0;while(true
6、){if(x==0)r.set("mike","nan");elser.set("丽丽","女女女女女");x=(x+1)%2;}}}classOutputimplementsRunnable{Resourcer;Output(Resourcer){this.r=r;}publicvoidrun(){while(true){r.out();}}}classResourceDemo3{publicstaticvoidmain(String[]args){Resourcer=newResource();Inputin=newIn
7、put(r);Outputout=newOutput(r);Threadt1=newThread(in);Threadt2=newThread(out);t1.start();t2.start();}}4、生产者和消费者问题:遇到的问题:1、出现了错误数据,是因为多生产多消费的时候,被唤醒的线程没有再次判断标记就执行了,解决时将if判断边成while循环判断,(这种方式是最安全的)2、有了while判断后死锁了,因为本方线程唤醒的有可能还是本方线程,所以导致死锁,解决:本方必须唤醒对放才有效,notify只能唤醒一个,还不确
8、定,所以干脆唤醒所有的,肯定包含对象,至于被唤醒的本方会判断标记是否继续等待。实现代码:ClassResource{PrvateStringname;Privateintcount;Privatebooleanflag;Privatesynchronizedvoidset(Stringna
此文档下载收益归作者所有