黑马程序员技术交流社区

标题: java同步与异步的问题 [打印本页]

作者: huima    时间: 2013-4-14 17:40
标题: java同步与异步的问题
本帖最后由 huima 于 2013-4-15 08:39 编辑

java中搞不清同步与异步的问题,在什么情况下分别使用它们,请举例详细说明???
作者: HM赵磊    时间: 2013-4-14 17:57
两点说:
异步:也就是互斥。当两个或者两个以上的线程访问线程共享数据时,为了避免数据错乱,使用synchronized来实现隐式的加锁与释放锁,来保证在某个时间当且只有一个线程来访问这个数据。
同步:也就是线程间通信。在毕老师的视频里面,有一个经典的同步不讲解,生产者----消费者的问题。生产者和消费者执行不同动作的线程。一个生产,一个消费,当生产的出来东西后,通过notify消费者线程来取(同步之所以也叫做线程间通信,就是因为这,生产者喊消费者来取),生产者调用wait()。反之,当消费者消费完后,她会通知生产者,哥们儿,再来点,notify生产者,自己wait()

另外:notify()和wait()必须在synchronized中
作者: 645420297    时间: 2013-4-14 21:15
同步:发送一个请求,等待返回,然后再发送下一个请求 异步:发送一个请求,不等待返回,随时可以再发送下一个请求 同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。异步则是可以提高效率了,现在cpu都是双核,四核,异步处理的话可以同时做多项工作,当然必须保证是可以并发处理的。这些都是对的。同步和异步最大的区别就在于。一个需要等待,一个不需要等待。比如广播,就是一个异步例子。发起者不关心接收者的状态。不需要等待接收者的返回信息电话,就是一个同步例子。发起者需要等待接收者,接通电话后,通信才开始。需要等待接收者的返回信息希望对你理解有帮助
作者: 何俊森    时间: 2013-4-14 21:27
同步(synchronized)和异步(asynchronized)是对于多线程(multi-threading)而言的
同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求
不到,怎么办,A线程只能等待下去
异步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程
仍然请求的到,A线程无需等待
显然,同步最最安全,最保险的。而异步不安全,容易导致死锁,这样一个线程死掉就会导致整个
进程崩溃,但没有同步机制的存在,性能会有所提升.
同步可防止并发 主要出于数据安全的考虑
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。

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

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

异步就是互不影响
ajax的第一个a就是异步,你一边浏览网页,后台一边和web服务器通信 检查你的用户名是否重复,但你却在前台根本看不出来.
作者: 黄玉昆    时间: 2013-4-14 22:47
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
作者: 刚金波    时间: 2013-4-15 08:30
学习了,问题很简单,不过很有必要了解清楚
作者: 崔宝东    时间: 2013-4-15 08:39
同步就是许多线程同时用一个资源,一个在用别的就要等,异步就相反了,可以不用等待:同步:发送一个请求,等待返回,然后再发送下一个请求 异步:发送一个请求,不等待返回,随时可以再发送下一个请求 同步可以避免出现死锁,读取数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。异步则是可以提高效率了,现在cpu都是双核,四核,异步处理的话可以同时做多项工作,当然必须保证是可以并发处理的。这些都是对的。同步和异步最大的区别就在于。一个需要等待,一个不需要等待。比如广播,就是一个异步例子。发起者不关心接收者的状态。不需要等待接收者的返回信息电话,对于电话,就是一个同步例子。发起者需要等待接收者,接通电话后,通信才开始,需要等待接收者的返回信息。




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