IO中同步与异步,阻塞与非阻塞区别(转)

Posted netpig

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO中同步与异步,阻塞与非阻塞区别(转)相关的知识,希望对你有一定的参考价值。

同步和异步关注的是消息通信机制 (synchronous communication/asynchronous communication)

同步请求,A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。

异步请求,A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。

同步和异步最大的区别就是被调用方的执行方式和返回时机。同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。

 

阻塞请求,A调用B,A一直等着B的返回,别的事情什么也不干。

非阻塞请求,A调用B,A不用一直等着B的返回,先去忙别的事情了。

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

非阻塞:不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

 

同步是个过程,阻塞是线程的一种状态。

同步、异步说的是被调用者会不会通知,阻塞、非阻塞说的是调用者会不会卡住不动。

 

先来看同步(普通水壶)场景中是如何包含阻塞和非阻塞情况的。

我们是用传统的水壶烧水。在水烧开之前我们一直做在水壶前面,等着水开。这就是阻塞的。

我们是用传统的水壶烧水。在水烧开之前我们先去客厅看电视了,但是水壶不会主动通知我们,需要我们时不时的去厨房看一下水有没有烧开。这就是非阻塞的。

 

再来看异步(有提醒功能的水壶)场景中是如何包含阻塞和非阻塞情况的

我们是用带有提醒功能的水壶烧水。在水烧发出提醒之前我们一直做在水壶前面,等着水开。这就是阻塞的。

我们是用带有提醒功能的水壶烧水。在水烧发出提醒之前我们先去客厅看电视了,等水壶发出声音提醒我们。这就是非阻塞的。

阻塞非阻塞说的是我,同步异步说的是水壶。

 

Java中的三种IO模型

在Java语言中,一共提供了三种IO模型,分别是阻塞IO(BIO)、非阻塞IO(NIO)、异步IO(AIO)。

这里面的BIO和NIO都是同步的IO模型,即同步阻塞IO和同步非阻塞IO,异步IO指的是异步非阻塞IO。

BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。

NIO (New I/O):同时支持阻塞与非阻塞模式,但主要是使用同步非阻塞IO。

AIO (Asynchronous I/O):异步非阻塞I/O模型。

原文:https://blog.csdn.net/qq_35642036/article/details/82798722 

以上是关于IO中同步与异步,阻塞与非阻塞区别(转)的主要内容,如果未能解决你的问题,请参考以下文章

IO中同步异步与阻塞非阻塞的区别(转)

[转] 比较清楚的阻塞与非阻塞和同步与异步

同步与异步,阻塞与非阻塞的区别

linux同步与异步阻塞与非阻塞概念以及五种IO模型

转:聊聊同步异步阻塞与非阻塞

Java 同步与异步-阻塞与非阻塞理解