- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ay13(多线程通信)总结 .doc
Dayl3总结
单列设计模式:
恶汉式:
代码体现:
Class Single {
Privtae static final Single s=new Single();
Private Single(){}
Public static Single getlnstance()
{
Return s;
}
}
懒汉式:延迟加载,存在着多线程并发访问的安全问题,箱要使用同步 来解决安全问题,但是同步会降低效率,所以使用双重if()判断形式解决效率低的 问题。
实现代码:
Class Singl e {
Private Si ngle () {}
Priv ate static S ingle s=null;
Public stat ic Single ge tlnstancef)
{
lf(s==null)
{
Synchroinzed (Single.clas s)
{
lf(s==nul I)
S=new Sing le();
}
Return s;
}
}
}
死锁:即同步的弊端,不是线程和进程没有了,而是不动了。
表现形式:同步嵌套的时候,使用的锁不一样,容易引发死锁。
实现代码:
线程间通信:
其实就是多个线程在操作同一个资源,但是操作的动作不同,动作不同,意味着线程 的任务是不一样的。就需要对任务对象进行单独的封装和描述。
等待唤醒机制:最重要的机制重点掌握
Wait ():等待:让当前线程出于冻结状态,当前线程就被存储到线程池当巾。
NotifyG;唤醒线程池屮的任意一个线程,让该线程恢复到运行状态,会具备CPU的执 行资格。
notifyAIIO:唤醒线程池中的所有等待的线程,让它们具备CPU的执行资格。
所谓的监视器:就是多线程中的锁。上面几个功能必须在同步当中,要标示清楚它所
在的锁。
也就说:wait到底让哪个锁上的线程等待了,noti fy:到底是唤醒了哪个锁上被等待 的线程。
Noti fyAII:用上面的一样。
为什么是Object巾的方法?
因为这些方法都是必须要标识出所属的锁,而锁是任意的对象。能被任意对象调用的 方法一定定义在Object类屮。一般在使用等待和唤醒时通常都得有标记。
代码优化:Res ourceDemo3.j ava class Res ource {
privat e String nam e;
private St ring sex;
pri vate boolean flag = fals e;
public syn chronized vo id set(Strin g nameStrin g sex) {
if(fl ag)
try{this.wait();}catc h(Exception e){} this.nam e = name; thi s.sex = sex; flag = true; this.notify();
}
public sy nchronized v oid out()
{
if (!flag)
try{t his.wait();}catch(Except ion e){}
Syst em.out.print ln(name+——+sex); flag = false;
thi s.notify();
}
} class Input implements Runnable {
Res ource r;
Inpu t(Resource r)
{
this.r = r;
public voi d run()
{
int x = 0; while (true)
{
if(x==O)
r.set(Hmi ke^nan);
e Ise
r.set(丽丽/女女女女女 x = (x+l)%2;
}
}
}
class Outp ut implement s Runnable {
R esource r;
Ou tput(Resourc e r)
{
this.r = r;
}
public void run()
{
w hile(true)
{
r .out();
}
}
} cl ass Resourc eDemo3
{
publi c static voi d main(Strin g[] args) {
R esource r =new Resource (); Input in = new Input(r);
Output ou t = new Outp ut(r);
Thread tl = new Th read(in);
Thr ead t2 = new Thread(out);
tl.start();
t2.start();
}
生产者和消费者问题:
遇到的问题:
出现了错误数据,是因为多生产多消费的吋候,被唤醒的线程没有再次 判断标记就执行了
文档评论(0)