zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    T6-Tensorboard 可视化之训练过程
    T5-tensorboard 可视化之图层
    T4-分类学习 classification
    P1-Python3 爬虫实战之糗事百科段子
    iOS之NavigationBar随滑动隐藏或显示
    iOS 之UIButton左文右图
    iOS 之图片尺寸
    iOS 之各种Crash
    公司开发者账号申请(包括邓白氏码申请)
    iOS之滑动隐藏导航
  • 原文地址:https://www.cnblogs.com/NetPig/p/10917339.html
Copyright © 2011-2022 走看看