阻塞非阻塞,同步异步

目录

一、阻塞非阻塞

1.1阻塞非阻塞针对调用方:

二、同步与异步:

2.1同步异步针对被调用方:

三、阻塞非阻塞同步异步举例

3.1同步阻塞 :

3.2同步非阻塞:

3.3异步非阻塞:

3.4异步阻塞:

四、I/O 流的阻塞与非阻塞

4.1阻塞 I/O:

4.2非阻塞 I/O:

五、I/O 流的同步与异步

5.1同步 I/O:

5.2异步 I/O:

六、结合实际 I/O 场景的例子:

6.1同步阻塞 I/O:

6.2同步非阻塞 I/O:

6.3异步非阻塞 I/O:

6.4异步阻塞 I/O:

七、总结


一、阻塞非阻塞

1.1阻塞非阻塞针对调用方:

调用方在被调用方准备好之前,调用方是在干等着,还是在做别的,如果调用方干等着就是阻塞,如果调用方边等边做别的就是非阻塞。

举例来说

  • 比如A调用B,A是调用方,B是被调用方,A在调用B后,A一直等着B即为阻塞,
  • A边等着B,边干点别的则为非阻塞

二、同步与异步

2.1同步异步针对被调用方:

被调用方是否主动通知调用方,如果是被调用方准备好了,通知调用方,则是异步,如果不通知,则是同步。

举例来说

  • 比如A调用B,A不停询问B或者A一直等待着B,B是被动的,则为同步
  • B准备好了,B通知A,则为异步

三、阻塞非阻塞同步异步举例

3.1同步阻塞 :

你去买奶茶,店员做奶茶,你坐着等,干等着,什么也不干,这就是同步阻塞

3.2同步非阻塞:

买奶茶付款后,你坐着等,边等边玩手机或边等边聊天,过一会儿去看看显示器或问问店员,我的奶茶做好了吗?这就是同步非阻塞

3.3异步非阻塞:

由于该卖家生意特火爆,你又非想喝这家奶茶,人太多了,做奶茶大概一个小时,店员说你先去逛逛,奶茶好了可以从小程序上看,买奶茶付款后,你去逛,奶茶好了微信小程序给你推送消息,你的奶茶好了,并附上取奶茶号码,你出示号码去取奶茶。

3.4异步阻塞:

一般没有这一说,因为异步就是为了解决阻塞的!

四、I/O 流的阻塞与非阻塞

4.1阻塞 I/O

  • 调用方发起 I/O 操作后,必须等待操作完成才能继续。比如,程序在读取文件内容时,直到文件内容完全读取完毕,程序才会继续执行其他代码。

4.2非阻塞 I/O

  • 调用方发起 I/O 操作后,不需要等待操作完成,可以继续执行其他代码。比如,程序在发起网络请求后,不需要等待服务器响应,可以去处理其他任务,稍后再检查请求是否完成。

五、I/O 流的同步与异步

5.1同步 I/O

  • I/O 操作完成后,被调用方不会主动通知调用方,所以调用方必须自己主动去检查结果是否准备好。比如,程序自己负责定期检查数据是否从网络读取完毕。

5.2异步 I/O

  • I/O 操作完成后,被调用方-即系统会自动通知调用方,无需调用方主动检查。比如,程序发起网络请求后,当服务器响应时,系统自动调用回调函数来处理结果。

六、结合实际 I/O 场景的例子:

6.1同步阻塞 I/O

  • 例子:假设你正在编写一个读取文件的程序。当你调用 InputStream.read() 方法时,程序会“停下来”等待数据从文件中读取完毕,读取过程中程序不会做其他事情。这类似于你在店里干等着奶茶做好。
  • 场景:这是最常见的 I/O 模型,大多数 I/O 操作默认都是阻塞的。虽然简单易用,但在高并发场景下效率较低。

6.2同步非阻塞 I/O

  • 例子:你编写的网络程序调用 Socket 读取数据时,程序不会被阻塞,而是定期检查是否有数据到达(例如使用 select()poll() 方法)。这就像你一边等奶茶一边玩手机,偶尔看看奶茶是否做好了。
  • 场景:在需要处理大量连接的服务器上,使用非阻塞 I/O 可以让程序在等待数据到达时处理其他连接,提高效率。

6.3异步非阻塞 I/O

  • 例子:你编写的程序发起网络请求后,不会等待响应,而是继续处理其他任务。当服务器响应时,系统会自动调用预先定义的回调函数处理数据,就像你去逛街,奶茶做好后通过微信小程序通知你回来取奶茶。
  • 场景:这种模式非常适合高性能和高并发场景,例如大型 Web 服务器或需要处理大量 I/O 操作的应用程序。

6.4异步阻塞 I/O

  • 例子:这种组合很少见,但可以假设一种极端情况:你发起了一个异步操作,操作完成后系统会通知你,但是你必须等到收到通知后才能继续进行下一步操作。虽然系统通知了你,但你的程序在等待这个通知时被阻塞住了。就像你去逛街,但一直在等待一条短信通知,而你只能干等着直到收到短信。
  • 场景:实际开发中很少遇到这种模式,因为异步的目的是为了避免阻塞。

七、总结

  • 阻塞与非阻塞:描述的是调用方在等待 I/O 操作完成时是否能够继续执行其他任务。阻塞意味着调用方必须等待操作完成,而非阻塞意味着调用方可以在等待时执行其他任务。
  • 同步与异步:描述的是被调用方在操作完成后是否主动通知调用方。同步意味着调用方需要自己去检查操作是否完成,而异步意味着被调用方会主动通知操作完成。

通过这种思路,我们可以更好地理解 I/O 流中的这些概念,以及如何在不同的场景中选择合适的 I/O 模型。

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
同步非阻塞和异步非阻塞是两种不同的函数调用方式。 同步非阻塞是指在发起函数调用后,调用方不会等待函数的结果返回,而是立即继续执行后续的代码。这意味着调用方无需等待函数的执行结果,可以继续处理其他任务。当函数执行完毕后,调用方可以通过轮询或者回调等方式来获取函数的结果。同步非阻塞的优点是能够提高系统的并发性和响应性。 异步非阻塞是指在发起函数调用后,调用方也不会等待函数的结果返回,但是与同步非阻塞不同的是,异步非阻塞会通过回调、事件通知等方式来通知调用方函数的执行结果。调用方可以继续执行其他任务,并在合适的时机处理函数的返回结果。异步非阻塞的优点是能够提高系统的并发性和性能,减少资源的浪费。 总结来说,同步非阻塞和异步非阻塞都是在函数调用时不会发生线程阻塞的情况下继续执行后续代码,但区别在于同步非阻塞需要主动轮询或回调来获取函数的结果,而异步非阻塞则通过回调或事件通知等方式传递函数的执行结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [深入理解同步阻塞、同步非阻塞、异步阻塞、异步非阻塞](https://blog.csdn.net/wangpaiblog/article/details/117236684)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值