黑马程序员技术交流社区

标题: 同步和异步有何异同,在什么情况下分别使用他们? [打印本页]

作者: Akm    时间: 2012-3-1 23:15
标题: 同步和异步有何异同,在什么情况下分别使用他们?
同步和异步有何异同,在什么情况下分别使用他们?举例说明。

作者: 王--明    时间: 2012-3-1 23:28
同步(synchronized)和异步(asynchronized)是对于多线程(multi-threading)而言的

同步可防止并发 主要出于数据安全的考虑
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。

异步允许并发
ajax技术通常都是异步实现的  
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

例子:
假如你给你媳妇存钱,先查了一下是1000,你要存100,结果你存的时候你媳妇也正在取钱,她准备取100,如果这个时候不锁定其中一人的操作,后果就很可能是,你媳妇取走了100,本来应该冲至账户金额为900,待还没有重置,你的存动作就过来了,因为之前你那里得到的信息是1000所以存的时候是1000+100,再以重置帐户,变成1100了 而不是900
这就是同步(一个人占用了,我就不能再做了)

异步就是互不影响
ajax的第一个a就是异步,你一边浏览网页,后台一边和web服务器通信 检查你的用户名是否重复,但你却在前台根本看不出来
作者: 田啸    时间: 2012-3-1 23:47
本帖最后由 田啸 于 2012-3-1 23:49 编辑

拿集合来说: ArrayList 和HashMap是异步,Vector和HashTable是同步,这里同步是线程安全的,异步不是线程安全的,举例说明:

当创建一个Vector对象时候,

Vector ve=new Vector();
ve.add("1");

当在多线程程序中,第一个线程调用修改对象ve的时候,就为其上了锁,其他线程只有等待。

当创建一个ArrayList对象时候,

ArrayList list=new ArrayList();
list.add("1");

当在多线程程序中,第一个线程调用修改对象list的时候,没有为其上锁,其他线程访问时就会报错。

所谓异步输入输出机制,是指在进行输入输出处理时,不必等到输入输出处理完毕才返回。所以异步的同义语是非阻塞

普通B/S模式(同步)AJAX技术(异步)   
           同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事   
           异步:   请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕


如果放在现实生活中,就是这样:
同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。   
异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。   
所以,要我请你吃饭就用同步的方法,要请我吃饭就用异步的方法,这样你可以省钱。


作者: 熊玖帅    时间: 2012-3-1 23:50
此问题有人问过,可以先在论坛搜索问题

同步是阻塞模式,异步是非阻塞模式

同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。  
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

在多线程处理代码块时
同步则是加了synchronized关键字的,只一个线程访问完时,另一个线才去访问
异步则是没有这个关键字,这样多个线程可以同时访问

作者: 许圣建    时间: 2012-3-2 01:39
大家都还是synchronized习惯啊,这个单词好长的嘛,Lcok&lock()多好~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2