A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 为谁开?茶花满 中级黑马   /  2013-4-29 16:09  /  2126 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

同步和异步有何异同,在什么情况下分别使用他们?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

倒序浏览
同步的前提:
                必须要有两个或者两个以上的线程
                必须是多个线程使用同一人锁
回复 使用道具 举报
同步和异步最大的区别就在于。
一个需要等待,一个不需要等待。
同步可以避免出现死锁,读脏数据的发生。
异步可以提高效率。

多线程中对共享、可变的数据进行同步。
多线程中访问共享可变数据才有必要。

对于函数中的局部变量没必要进行同步。
对于不可变数据,也没必要进行同步。

回复 使用道具 举报
同步:发送一个请求,等待返回,然后再发送下一个请求 。
异步:发送一个请求,不等待返回,随时可以再发送下一个请求 。
两者最多区别在于,同步需等待,异步不需等待。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
  如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
   当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果你是FBI特工,你追一个恐怖分子,这时可能有两种情况:
1、你一边跑,一边开枪,这就是异步,两件事同时做:
Action you1 = new Action("追赶恐怖分子");
Action you2 = new Action("开枪射击");
you1.start();//追赶
you2.start(); //开枪
——这个代码可能不太恰当,就是为了举个例子,you1和you2是两个动作,但是是同时运行的

2、你跑一步,停下,开一枪,这叫同步,事情得一件一件做
You you = new You();
you.runToHim();  //追赶
you.shoot();  //开枪
——看这段代码,你追他,如果想开枪,就得停下开枪,开完再跑,这叫同步,shoot必须等runToHim运行完
之后才能执行

点评

有趣的例子  发表于 2013-4-29 23:43

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
黄玉昆 黑马帝 2013-4-30 23:37:18
7#
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
同步:发出的请求必须得到返回的结果才去执行下一步的操作
       同步如果发出去的请求,在没有得到返回的结果之前会一直停在那里。
异步:发出的请求不必得到返回的结果就去执行下一步的操作
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马