阻塞非阻塞和同步异步的区分 参考一些书籍

编程中一直对这两个概念不是很理解,在网上搜了很多资料大概描述的其实都很模糊,有时候还自相矛盾,很容易搞混,这里说一下我对这两个概念的理解。
首先看一下相关技术书籍对这两个概念的描述,下面分别是摘自《深入理解Java核心技术》和《Java并发程序设计中的》的内容。
摘自《深入理解Java核心技术》14.2:

当I/O操作发生时,一定是有两方参与的,分别是调用方和被调用方。阻塞和非阻塞描述的是调用方,同步和异步描述的是被调用方。
例如A调用B:
1.如果是阻塞,那么A在发出调用命令后,要一直等待B返回结果。
2.如果是非阻塞,那么A在发出调用命令后,不需要等待,可以去做自己的事情。
3.如果是同步,那么B在收到A的调用命令后,会立即执行要做的事,A的本次调用可以得到结果
4.如果是异步,那么B在收到A的调用命令后,不保证会立即执行要做的事,但是保证会做,B在做好了之后会通知A。A的本次调用得不到·结果,但是B执行完成要做的事之后会通知A。
因为同步/异步与阻塞/非阻塞描述的对象不同,所以这二者之间是没有必然联系的。也就是说,同步不一定阻塞,异步也不一定非阻塞。
只不过通常很少存在异步且阻塞的场景,所以很多人误以为同步一定是非阻塞的、异步一点事非阻塞的。

摘自《Java高并发程序设计》1.2:

同步和异步通常用来形容一次方法的调用。同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中”真实”地执行。整个过程,不会阻碍调用者的工作。对于调用者来说,异步调用似乎是一瞬间就完成的。如果异步调用需要返回结果,那么当这个异步调用真实完成时,则会通知调用者。
阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其他所有需要这个资源的线程就必须在这个临界区中进行等待。等待会导致线程挂起,这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其他所有阻塞在这个临界区上的线程都不能工作。 非阻塞的意思与之相反,它强调没有一个线程可以妨碍其他线程执行。所有的线程都会尝试不断前向执行。

两本书籍的描述切入点不一样,乍一看两个书籍描述的可能还有点冲突,反而让人更迷糊。
在我看来 阻塞和非阻塞必然是线程或进程相关的,阻塞指的是如果线程无法立即获取到资源是是否需要暂停线程等待资源准备完成,非阻塞则与之相反,即我不会等待我先去干别的事情,等到资源准备好了再通知线程进行处理。
同步即所有的代码都是按顺序执行的,可以理解为这个事情不干完了我就不干别的事情。异步则不可预测顺序的,异步调用必须伴随着通知,可以理解为等到取值完成后我再进行后续的操作,我先去干别的事情。

同步异步和阻塞非阻塞搭配就会出现如下四种组合:

  1. 同步阻塞,如果不能立即获取数据,则线程阻塞等待数据返回。因为程序阻塞了,需要有其他程序将程序唤醒(这里很重要),如java类FileInputStream的readBytes操作。
  2. 同步非阻塞,如果不能立即获取数据,则循环检查数据是否完成。这里不需要其他线程参与唤醒操作。比如java类AtomicInteger的自增操作,如果不能加1就循环执行。
  3. 异步非阻塞,如果不能立即获取数据,则立即返回执行其他操作。等到数据返回了,接收到通知后再进行后续的处理工作(这里后续的处理操作是别的线程去做了,因为当前线程可能已经退出了)。
  4. 异步阻塞,这应该是一个并不存在的组合,异步和阻塞是互斥的。既然都可以异步执行,你还阻塞干什么呢,执行完成之后再通知你不就好了吗,异步的目的不就是无法立即获取数据让线程去干别的事情吗,如果没有别的事情可做就同步阻塞等待就可以了

总结:
如果一个程序说他是异步的,那他肯定非阻塞的,因为并不存在异步阻塞。开启异步的目的就是不想让当前线程阻塞,让他去干其他事情。就是你需要获取一个资源或发出一个通知,但是你并不能立即获取这个资源或者知道通知是否发送成功,这个时候你就需要线程去干别的事( 这里的别的事指不依赖前面调用返回结果的代码)。等结果出来了再对结果进行处理,如对资源解析或者重新发送消息。

Original: https://www.cnblogs.com/soker/p/16440265.html
Author: 大兴神
Title: 阻塞非阻塞和同步异步的区分 参考一些书籍

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622785/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 一文读懂Spring框架中依赖注入流程

    想读懂Spring的依赖注入流程,我们先简单了解一下Ioc和DI是什么? IoC和DI Ioc—Inversion of Control,即”控制反转”,不…

    数据库 2023年6月6日
    097
  • 删除chrome的域名安全策略

    使用过程中总有特殊情况必须使用http请求、又或者必须使用https请求 目前有两种思路,一种是浏览器默认开了http转https请求,像chrome和Firefox,另一种就是服…

    数据库 2023年6月6日
    0106
  • 如何实现跨域?

    https://blog.csdn.net/meism5/article/details/90414283 Original: https://www.cnblogs.com/cr…

    数据库 2023年6月16日
    099
  • 从学校到公司,2022新的起点!!!

    步入新的阶段 目前仍然是大学生的身份,但也算是打工人了。2021秋招时来到了天津的一个公司做实习生,并签订了三方协议。已经来公司将近一个月了,我在这段时间想了很多关于我的未来发展方…

    数据库 2023年6月6日
    083
  • mysql多表关联时可能出错的地方,如搜索出的记录数据变少了。

    当多个表相关联时,就会出现此问题。 [En] This problem occurs when multiple tables are associated.例如其中单位串以单位表…

    数据库 2023年5月24日
    088
  • java中如何将函数作为参数传递呢?

    函数简介: 函数(function)的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射…

    数据库 2023年6月11日
    0100
  • 获取不到数据库连接问题

    org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; …

    数据库 2023年6月11日
    093
  • 【黄啊码】关于微信支付走过的坑

    错误:未定义数组索引:openid 。经过检查发现是 :微信支付授权获取 openId {“errcode”:40163,”errmsg&#82…

    数据库 2023年6月16日
    094
  • FastDFS客户端与django自定义文件存储系统

    1. FastDFS的Python客户端 python版本的FastDFS客户端使用说明参考https://github.com/jefforeilly/fdfs_client-p…

    数据库 2023年6月14日
    093
  • 基础知识,不是很了解的

    Java中方法参数传递方式是按值传递。对于基本类型(int a, long b),参数传递时传递的是值,例如int a = 5,传递的就是5。如果是引用类型,传递是指向具体对象内存…

    数据库 2023年6月14日
    0114
  • mybatis 拦截器

    1.mybatis拦截器介绍 拦截器可在mybatis进行sql底层处理的时候执行额外的逻辑,最常见的就是分页逻辑、对结果集进行处理过滤敏感信息等。 public Paramete…

    数据库 2023年6月16日
    094
  • django中的模板层简介

    1.什么是模板层 模板层可以根据视图中传递的字典数据动态生产相应的HTML页面 2.模板层的配置 1.在项目&am…

    数据库 2023年6月14日
    093
  • MySQL-过滤数据(WHERE语句)

    1、使用WHERE子句 在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名( FROM子句)之后给出,如下所示: 这条语句从products…

    数据库 2023年6月16日
    0132
  • JAVA编程练习01作业

    2 、 输入一个圆半径(r),计算并输出圆的面积和周长。 3 、输入一个三位正整数n,输出其个位、十位和百位上的数字。 4 、根据性别和体重计算输血量。女性体重不超过50kg的输血…

    数据库 2023年6月11日
    0169
  • 组管理和权限管理

    组管理和权限管理 在 linux 中的每个用户必须属于一个组,不能独立于组外。在 linux 中每个文件有所有者、所在组、其它组的概念。 文件所有者,谁创建了这个文件就是这个文件的…

    数据库 2023年6月16日
    0232
  • MySQL实战45讲 16

    16 | “order by”是怎么工作的? 以公民表为例,假设您想要查询所有城市为“杭州”的人的姓名,并根据他们的名字返回前1000人的姓名和年龄。 [E…

    数据库 2023年5月24日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球