今天老师讲了同步阻塞 同步非阻塞 异步阻塞 异步非阻塞。讲完感觉老师自己说的都是前后矛盾的。去网上找了几篇大佬的博客,看完后才有点点感悟。特地小结记下来,若有错误之处,欢迎大家斧正。
首先先弄清楚同步和异步 ,阻塞和非阻塞。
1. 同步和异步(指的是消息)
同步和异步描述的是消息通信的机制
同步:
一次调用,一次返回;整个过程就是同步调用的过程;
特点:针对每次都是一次同步的调用;
异步:
调用后,没有得到想要的返回(或者不care返回值);而是通过后面的回调、状态通知的方式获得结果;
特点:通过回调callback、状态或者通知的方式告知调用方结果;
2. 阻塞和非阻塞 (指的是进程/任务)
描述的是程序在等待调用结果(消息、返回值)时的状态
阻塞:
调用方线程在等待结果返回过程中,线程被挂起,(调用方不能处理其它事情)等结果返回后,唤醒线程;
特点:调用方被阻塞
非阻塞:
调用方线程在等待结果的过程中,线程没有被挂起,(可以处理其它事情)
特点:调用方没有被阻塞
这里的关系就像水火和冷热一样,是两组不同的相对概念。但是第一反应水是冷的,火是热的。其实呢开水温度也有100度,鬼火(磷火)也只有40度。
老师以前叫promise和async时经常说同步要等它执行完,异步就可以不用管。导致和后面学的阻塞与非阻塞产生歧义。
同步异步只是指消息通知给调用方的方式(被动查看,主动返回),阻塞和非阻塞才是等待任务进程调用结果(消息、返回值)时的状态。
通俗的用最近去医院来举例
同步阻塞
去医院挂号,医院的提示铃声坏了,你怕错过什么事也不做(阻塞)一直紧紧盯着当前的就诊号消息(同步)。这叫同步阻塞,时间利用率低
同步非阻塞
也是去医院的提示铃声坏了,你看着人多便开始刷剧(非阻塞)但是也时不时看一下当前的就诊号消息(同步)。这叫同步非阻塞,时间利用率较高。
异步阻塞
医院的提示铃声修好了,到一定时间它自己会广播提示(异步)。但是你也什么也不做也不看当前就诊信息,就发呆(阻塞)。这叫异步阻塞,效率和同步阻塞没什么两样,时间利用率低。
异步非阻塞
医院的提示铃声修好了,到一定时间它自己会广播提示(异步)。但是你这个时间坐下来看小说,打游戏,刷b站(非阻塞)。没有不刻意查看当前就诊号。这叫异步非阻塞,时间利用率高。
同步是需要自己主动查询任务状态获取信息,异步是任务自己返回结果给调用方。调用方不必主动查询。阻塞就是等待。
版权声明:本文为参考CSDN博主「安心写bug」的原创文章后的总结,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:/qq_36963372/article/details/83353017
如果觉得《同步阻塞 同步非阻塞 异步阻塞 异步非阻塞》对你有帮助,请点赞、收藏,并留下你的观点哦!