前言
由于如今网上很多关于同步异步的解释和阻塞非阻塞的概念十分相近,导致很多人包括我自己都很难正确区分这两组概念。搜两者区别网上又众说纷纭,各自有各自的侧重点。而我在查阅了许多博客之后,终于算是形成了一套能说服我自己的理解方式……
同步与异步
同步和异步我将其理解成一种通知和处理的机制,两者代表不同的获取结果方式,也代表服务端不同的处理方式。同步表示请求端主动去查询结果,且服务端必须按请求顺序处理请求,处理完这个才能处理下一个;异步则表示服务端主动将结果返回给请求端,且可以接收多个请求,哪个先处理完了就先返回哪个。
阻塞与非阻塞
而阻塞和非阻塞我将其理解成一种等待结果的机制,两者代表请求端不同的等待方式。阻塞表示请求端只会在这里干等结果,而非阻塞表示请求端一边处理别的事一边等结果。
看过网上大佬举的买书、烧水的一些例子,不知是不是我愚钝,感觉并不能非常地贴切。所以我也来举个简单的小例子。
举例
前几天二模考试刚结束,我急切地想要知道自己的成绩,于是我打电话向老师发起查看成绩的请求,那么此时就可以把“我”看做是请求端,“老师”则是服务端。
1. 如果发起请求之后,老师和我说试卷还没有改,但她现在就开始改我的试卷,让我之后再来问(结果是我来查询的,所以这是同步)。但是在这之后,老师又收到了小明同学的电话,原来小明也想知道自己的二模成绩,但是老师必须按请求顺序来处理,所以要先改完我的卷子才能去改小明的卷子。(所以说同步需要等待完成这个任务才能开始下一个任务,这也是容易和阻塞混淆的地方)
- 如果我心急如焚,根本没有心思做别的事情,就一直不挂断电话在这里等着直到成绩改完(这是阻塞),等了两个半小时,老师电话那头终于跟我说改完成绩了,这整个就是同步阻塞。
- 如果我假装镇静,是一边在玩蛋仔派对一边等(这是非阻塞),但是我隔一会打个电话问问,隔一会打个电话问问(轮询),打了66个电话之后,终于知道了自己的成绩。这整个是同步非阻塞。
2. 如果我发起请求之后,老师和我说试卷还没有改完,她现在记下了我的名字(我的请求进入异步消息队列),等她改完知道我的成绩之后发短信告诉我(结果是老师告诉我的,所以这是异步)。但是在这之后,老师又收到了小明同学问成绩的电话,她又记下了小明的名字(小明的请求也进入异步消息队列),也告诉小明等老师知道他成绩之后短信告诉他。(所以我们发现异步相比同步的一个优点,就是可以提高吞吐量,增加请求的连接数)谁的试卷先改完就先发短信通知。
- 如果我心急如焚,根本没有心思做别的事情,就一直不挂断电话在这里等着直到成绩改完(这是阻塞),等了两个半小时,终于收到老师短信发来的成绩通知。这就是异步阻塞。(没有什么意义,一般不讨论)
- 如果我假装镇静,是一边在玩蛋仔派对一边等(这是非阻塞),等了两个半小时,蛋仔都成凤凰蛋了,终于收到老师的成绩通知。这就是异步非阻塞。
以上就是本人粗浅的理解,不妥之处还请批评指正。