同步和异步
说到烧水,我们都是通过热水壶来烧水的。在很久之前,科技还没有这么发达的时候,如果我们要烧水, 需要把水壶放到火炉上,我们通过观察水壶内的水的沸腾程度来判断水有没有烧开。
随着科技的发展,现在市面上的水壶都有了提醒功能,当我们把水壶插电之后,水壶水烧开之后会通过声音提醒我们水开了。
对于烧水这件事儿来说,传统水壶的烧水就是同步的,高科技水壶的烧水就是异步的。
同步请求
A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。
异步请求
A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。
所以说,同步和异步最大的区别就是被调用方的执行方式和返回时机。 同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。
阻塞和非阻塞
还是那个烧水的例子,当你把水放到水壶里面,按下开关后,你可以坐在水壶前面,别的事情什么都不做, 一直等着水烧好。你还可以先去客厅看电视,等着水开就好了。
对于你来说,坐在水壶前面等就是阻塞的,去客厅看电视等着水开就是非阻塞的。
阻塞请求
A调用B,A一直等着B的返回,别的事情什么也不干。
非阻塞请求
A调用B,A不用一直等着B的返回,先去忙别的事情了。
所以说,阻塞和非阻塞最大的区别就是在被调用方返回结果之前的这段时间内,调用方是否一直等待。 阻塞指的是调用方一直等待别的事情什么都不做。非阻塞指的是调用方先去忙别的事情。
阻塞、非阻塞和同步、异步的区别
首先,前面已经提到过,阻塞、非阻塞和同步、异步其实针对的对象是不一样的。
给我大声念三遍下面的句子
阻塞、非阻塞说的是调用者。同步、异步说的是被调用者。
阻塞、非阻塞说的是调用者。同步、异步说的是被调用者。
阻塞、非阻塞说的是调用者。同步、异步说的是被调用者。
有人认为阻塞和同步是一回事儿,非阻塞和异步是一回事。但是这是不对的。
同步包含阻塞和非阻塞
我们是用传统的水壶烧水。在水烧开之前我们一直做在水壶前面,等着水开。这就是阻塞的。
我们是用传统的水壶烧水。在水烧开之前我们先去客厅看电视了,但是水壶不会主动通知我们, 需要我们时不时的去厨房看一下水有没有烧开,这就是非阻塞的。
异步包含阻塞和非阻塞
我们是用带有提醒功能的水壶烧水。在水烧发出提醒之前我们一直做在水壶前面,等着水开。这就是阻塞的。
我们是用带有提醒功能的水壶烧水。在水烧发出提醒之前我们先去客厅看电视了,等水壶发出声音提醒我们。这就是非阻塞的。推荐阅读:46 道阿里巴巴 Java 面试题,你会几道?