同步和异步,阻塞和非阻塞
同步和异步关注的是结果消息的通信机制:(调用方是否需要主动查询结果)
同步:调用方需要主动等待结果的返回。
异步:不需要主动等待结果的返回,而是通过其他手段,比如状态通知,回调函数等。
阻塞和非阻塞主要关注的是等待结果返回时调用方的状态:(调用方是否可以做其他事情)
阻塞:是指结果返回之前,当前线程被挂起,不做任何事。
非阻塞:是指结果在返回之前,线程可以做一些其他事,不会被挂起。
下面用几个简单的例子说明:
同步阻塞:
同步阻塞基本也是编程中最常见的模型,打个比方你去商店买衣服,你去了之后发现衣服卖完了,那你就在店里面一直等,期间不做任何事(包括看手机),等着商家进货,直到有货为止,这个效率很低。
同步非阻塞:
同步非阻塞在编程中可以抽象为一个轮询模式,你去了商店之后,发现衣服卖完了。
这个时候不需要傻傻的等着,你可以去其他地方比如奶茶店,买杯水,但是你还是需要时不时的去商店问老板新衣服到了吗。
异步阻塞:
异步阻塞这个编程里面用的较少,有点类似你写了个线程池,submit 然后马上 future.get(),这样线程其实还是挂起的。
有点像你去商店买衣服,这个时候发现衣服没有了,这个时候你就给老板留个电话,说衣服到了就给我打电话,然后你就守着这个电话,一直等着它响什么事也不做。这样感觉的确有点傻,所以这个模式用得比较少。
异步非阻塞:
这也是现在高并发编程的一个核心。
好比你去商店买衣服,衣服没了,你只需要给老板说这是我的电话,衣服到了就打。然后你就随心所欲的去玩,也不用操心衣服什么时候到,衣服一到,电话一响就可以去买衣服了。