您的位置:首页 > 编程语言 > Java开发

Java中的同步与异步

2016-02-28 21:41 337 查看
在一篇博文里找到下面这些通俗的比喻 把同步和异步讲解的很透彻 转截过来

 

举个例子:普通B/S模式(同步)AJAX技术(异步)   

           同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事   

           异步:   请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

          

           同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。 
  

           异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。 
 

所以,要我请你吃饭就用同步的方法,要请我吃饭就用异步的方法,这样你可以省钱。

以通讯为例   

           同步:发送一个请求,等待返回,然后再发送下一个请求   

           异步:发送一个请求,不等待返回,随时可以再发送下一个请求   

           并发:同时发送多个请求

百度百科容器的文章,看到介绍 ArrayList 和HashMap是异步,Vector和HashTable是同步,这里同步是线程安全的,异步不是线程安全的,举例说明: 

当创建一个Vector对象时候, 

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

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

当创建一个ArrayList对象时候, 

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

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

eg:list.remove("1"),然后再由其他线程访问list对象的1时就会报错。

但问题是,为什么Vector的对象有上锁,而ArrayList的对象没有上锁呢???(估计是Java语言底层的限制,在此希望网友能分享见解给我。)

原文:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  异步 同步