总论
同步异步:都是针对服务端操作而言
阻塞非阻塞:都是针对客户端状态而言
同步: 强调的是执行的有序性
异步:则是因为服务端的协作方式的改变而产生的一个快速响应的假象
同步:
对于在同一时间使用同一资源的多个用户而言,这多个用户必须一个一个有序访问资源。此时,每一个用户都存在一个最小单元的物理等待时间。
异步:
真正意义上的异步是不存在的,同步性只能被转移和拆分而无法消失。但所有的概念都是有参考系的。异步本质是对同步最小物理等待单元的进一步拆分。拆分的方式就是服务端的协作优化。
阻塞非阻塞强调的是状态
阻塞:
在得到返回值之前一直等
非阻塞:
在得到返回值之前干其他事情
举个例子
早上排队吃煎饼果子,煎饼果子老板一人(排队人是客户端,老板是服务端)
同步性:老板在同一时间只能给一个顾客做煎饼果子,其他人在此时此刻是不能再让老板做煎饼果子了。(一个做完做下一个,有序进行。)
阻塞状态: 其他人可以排队一直等
为了解决大家的排队问题(改变阻塞问题),老板招了一个副手(优化内部协作方式)
对于不想排队的顾客,他们可以直接找副手,做一个预定,然后做好了再去通知顾客。
副手的响应时间是远远小于老板的响应时间的,因为副手只需要告诉顾客现在能做还是不能做,然后顾客就立刻知道的现在的服务状态了,可以选择不排队了。这就是一种异步行为(本质是等待时间更小的同步行为,因为一个人再问副手的时候,其他人也要等待副手~ ,这就是同步性只能转移和拆分但是无法消失) 而对于顾客不排队去干其他事的状态叫做非阻塞状态
同步阻塞: 服务提供者的本身是具有有序性的,需要同步执行,但是服务调用者可以选择等待
同步非阻塞
异步就是异步 真正的异步就没有阻塞非阻塞这样的概念! 如果认为有异步存在,那就是将最小的等待时间定义在了同步的粒度上。那么一切都是非阻塞的。如果任务异步中还有阻塞的概念存在,那这个就不能叫做异步!!!
NIO: 异步复用,快速响应客户端请求,客户端请求非阻塞。select轮询查找符合条件的请求并建立连接,select的这个过程就是同步过程