脚本宝典收集整理的这篇文章主要介绍了【死磕NIO】— 阻塞、非阻塞、同步、异步,傻傻分不清楚,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
万事从最基本的开始。
要想完全掌握 NIO,并不是掌握上面文章(【死磕NIO】— NIO基础详解)中的三大组件就可以了,我们还需要掌握一些基本概念,如什么是 IO,5 种IO模型的区别,什么是阻塞&非阻塞等等,只有掌握了这些基本概念,我们对NIO才能理解得更加得心应手。
这篇文章我们就从阻塞&非阻塞,同步&异步说起。
同步指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。
异步与同步相对(这解释让我无言相对)
所以,我们需要明确的是同步与异步针对的是两个或者两个以上的事物
。
对于同步而言,一个任务(调用者)的完成需要依赖另一个人任务(被调用者)的完成,只有等待被依赖的任务完成,依赖的任务才会继续进行,两者步调保持一致。
异步呢?任务与它依赖的任务没有必然的联系,它不需要等待它依赖的任务完成,它只需要向依赖任务发起调用即可,告诉它你可以干活了,至于你啥时候干完跟我没关系。
所以说,同步和异步的本质区别就在于调用者与被调用者之间结果消息通知机制的不同
。
主动等待
被调用者的结果。所以,同步和异步一个是主动等待结果,一个是被动知道结果。
举一个简单的例子:买奶茶,我们有两种方式拿到我们买的奶茶
上面提到异步调用可以通过状态、通知或者回调函数来告知调用者。
上面解释了什么是同步与异步,那什么是阻塞与非阻塞呢?
所谓阻塞,就是有障碍而不能通行,无法畅通。
所以,阻塞就是调用结果返回之前,该线程会被一直挂起,一直等待结果,不能继续,函数只有在得到结果之后才会返回
。
可能有小伙伴会将阻塞与同步等同起来,因为他们都是因为等待执行结果而停滞不前,其实两者还是有区别的:
非阻塞则与阻塞概念相对,指在不能立即得到执行结果之前,该函数不会阻碍当前线程执行,而是会立即返回
。
还是上面那个买奶茶的例子,不论是排队在那里等奶茶还是扫码在哪里等奶茶,只要在等奶茶的过程中你没有做其他事情都是阻塞。如果你在等的过程跟你女朋友聊天(假如你有女朋友的话)或者在玩手机,那么就是非阻塞,因为没有因等待奶茶这件事一直耗着,而是一边等一边干其他的事情。
同步&异步与阻塞&非阻塞两两组合,分别为同步阻塞
,同步非阻塞
,异步阻塞
,异步非阻塞
。以上面等奶茶的例子为例。
同步阻塞
你在排队等奶茶的过程中,什么事情都不能做,只能干等着。就问你无聊不无聊,尴尬不尴尬。效率最为低下
。
同步非阻塞
你在排队等奶茶的过程中,可以干其他事情,比如刷抖音,玩一把王者荣耀,但是你需要不断地看奶茶是否已经到你,你势必会分心导致输掉王者荣耀,成为一个坑货。注意排队等奶茶,玩王者荣耀是两件事情,你需要两件事情来回不断地切换,效率也不见得高到哪里去
。
异步阻塞
你扫码拿号后,你不用在那里排队干等,你只需要等候服务员告诉你奶茶做好了去拿就可以了,但是在这个等的过程中,你啥事都不能干,只能干等着。很显然你已经被阻塞在这个等待服务员告诉你奶茶做好了的事情(消息通知
)上面了。我们要注意是,并不是说异步就不能阻塞了,异步也是可以阻塞的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞了
。
异步非阻塞
你扫码拿号后,直接去边上玩王者荣耀了,中途你专心玩的王者荣耀,不需要分心去关注你的奶茶是否做好了,你只需要在那里等服务员告诉你奶茶做好了(消息通知
)去拿就可以了。效率最高
。
以上是脚本宝典为你收集整理的【死磕NIO】— 阻塞、非阻塞、同步、异步,傻傻分不清楚全部内容,希望文章能够帮你解决【死磕NIO】— 阻塞、非阻塞、同步、异步,傻傻分不清楚所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。