该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

前言

在最近的一些面试中,跟应聘者聊了比较多关于“同步/异步,阻塞/非阻塞”相关的话题,发现大家对于这些概念的理解都比较模糊,甚至有的同学会反问“他们不就是同一个东西吗?”。所以借着这么一个机会,我想用一些尽量简单的例子,尽量简洁的语言来聊聊自己对于这些概念的看法。

正文

这篇文章想通过一个老王“候车”的案例来解释这些概念。

同步阻塞

放假了,老王回到了乡下,由于乡下的基础设施比较差,当他在车站候车的时候,只能一直在干等着,直到公交车的到站。

这时候对于公交车(被调用着者)来说,它是“同步“的。老王(调用者)被公交车(被调用者)“阻塞”在站台上。

异步阻塞

放完假了,老王回到了大城市开始上班,同样在车站候车,一样在车站干等着,但是大城市的基础设施建设得比较好,当公交车到站的时候,会有广播提示提醒乘客。

那么这时候对于公交车(被调用着者)来说,它是“异步“的,到站后会通知调用者。但是此时老王(调用者)还是被公交车(被调用者)“阻塞”在站台上。

同步非阻塞

过年了,老王放假回来了乡下,又要开始候车了,这时候他变聪明了,没有一直在车站上干等着,而是去找隔壁的小花叙叙旧。但是又害怕车到站了自己会错过,就只能隔一段时间过来看看车到了没。

那么这时候对于公交车(被调用着者)来说,它是“同步“的。但是此时老王(调用者)可以在候车的时候去干其他的的事情,所以他是“非阻塞”的。

异步非阻塞

春风吹满地,新农村建设正在火热进行中,此时的乡下,公交车里面也安装了车辆到站的提醒广播。现在老王在候车的时候,可以安心的跟小花叙旧了,当听到自己需要乘坐的车辆到站广播时,才过去车站上车。

这时候对于公交车(被调用着者)来说,它是“异步“的,到站后会广播提醒,此时老王(调用者)可以在候车的时候去干其他的的事情,所以他是“非阻塞”的

概念总结

从上面的示例中,我们可以明白一件事情,同步异步,阻塞非阻塞他们针对的对象是不一样的。对于调用者来说是阻塞跟非阻塞,被调用者是同步跟异步。

同步:A调用B,此时只有等B有结果了才返回。

异步: A调用B,B立即返回,无须等待。当B处理完之后会通过通知或者回调函数的方式来告诉A结果。

阻塞:A调用B,A会被被挂起,一直在等待B的结果,什么事都不能干。

非阻塞:A调用B,自己用被挂起等待B的结果,可以去干其他的事情。

Java中相关概念

在Java中的IO模型有三种,分别是BIO(同步阻塞IO),NIO(同步非阻塞IO),AIO(异步非阻塞IO)。这时候我们会发现,异步阻塞的模型是不存在的。

NIO跟AIO的出现解决了很多在BIO使用过程遇到的难题,所以我们在选择使用何种IO的时候需要根据业务场景来做决定,没必要一味追求NIO跟AIO,不仅加大了编码的难度也提高的出错的概率,技术的出现是为了更好的解决问题。

结语

这篇文章主要是想通过大家熟悉的场景来描述这些概念的含义以及区别,如果想更深入的去钻研的话,大家可以去查阅Linux IO模型相关资料,Java的IO API也是基于这些基础模型来封装的。

java 异步阻塞_大白话搞懂什么是同步/异步/阻塞/非阻塞相关推荐

  1. 大白话搞懂什么是同步/异步/阻塞/非阻塞

    前言 在最近的一些面试中,跟应聘者聊了比较多关于"同步/异步,阻塞/非阻塞"相关的话题,发现大家对于这些概念的理解都比较模糊,甚至有的同学会反问"他们不就是同一个东西吗? ...

  2. java 同步 异步 阻塞 非阻塞_Java日志正确使用姿势,大白话搞懂什么是同步/异步/阻塞/非阻塞...

    前言 关于日志,在大家的印象中都是比较简单的,只须引入了相关依赖包,剩下的事情就是在项目中"尽情"的打印我们需要的信息了.但是往往越简单的东西越容易让我们忽视,从而导致一些不该有的 ...

  3. python stdout.read()阻塞_通过阅读python subprocess源码尝试实现非阻塞读取stdout以及非阻塞wait...

    http://blog.chinaunix.net/uid-23504396-id-4661783.html 执行subprocess的时候,执行不是问题 最麻烦的是获取进程执行后的回显来确认是否正确 ...

  4. java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...

    0 前言 初学JAVA时,总会对一些概念一知半解,相互混淆,不明其设计的用意,如类.对象.重载.封装.继承.多态.覆盖.抽象类.接口概念.为便于理解和巩固,本文将基于一个案例及其变形,展现各个概念的定 ...

  5. 学习java多线程,这必须搞懂的这几个概念

    转载自 学习java多线程,这必须搞懂的这几个概念,很重要. 同步和异步 同步,Synchronous,即调用方法开始,一旦调用就必须等待方法执行完返回才能继续下面的操作. 举个例子,你去银行ATM取 ...

  6. JAVA每个初学者都应该搞懂的问题 还可以比较基础

    还可以比较基础 转自http://blog.csdn.net/devillyd/article/details/2486520 对于这个系列里的问题,每个学Java的人都应该搞懂.当然,如果只是学Ja ...

  7. 深入理解非阻塞同步IO和非阻塞异步IO

    这两篇文章分析了Linux下的5种IO模型 http://blog.csdn.net/historyasamirror/article/details/5778378 http://blog.csdn ...

  8. python协程详解_彻底搞懂python协程-第一篇(关键词1-4)

    任何复杂的概念或系统都不是凭空出现的,我们完全可以找到它的演化历程,寻根究底终会发现,其都是在一系列并不那么复杂的简单组件上发展演化而来! by 落花僧 本文通过一系列关键概念,逐步递进理解协程. 0 ...

  9. 汉字乱码_彻底搞懂这烦人的编码与乱码!

    ❝ 我们平时在处理文本文件或者网络请求时,时不时会遇到乱码的情况,这篇文章就带你彻底搞懂编码和乱码 ❞ 首先,我们要知道,在计算机中,一切都是用0和1来表示的.普通的txt文件.或者客户端发过来的数据 ...

最新文章

  1. AMD and CMD are dead之js模块化黑魔法
  2. 图像偏色检测算法,速度快,效果好,共享给大家。
  3. 趣味理解:三层架构与养猪—《.NET深入体验与实战精要》
  4. Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — Buffer descriptor table
  5. NTU课程笔记 MAS714(8) 分治与排序
  6. Hystrix文档-实现原理
  7. STM32F4 HAL库开发 -- NVIC 中断优先级管理
  8. 整合Spring Security
  9. JavaScript入门(part5)--数据类型转换
  10. tf.variable_scope() and tf.name_scope()
  11. java不可变类型_Java中的值类型:为什么它们不可变?
  12. mysql sql wait 写法_有关SQL语句写法注意的那些事情(原创整理)
  13. javascript学习系列(4):数组中的some方法
  14. mongo的php查询,使用PHP进行简单查询的mongo查询速度慢
  15. Java 并发编程之同步工具类栅栏 CyclicBarrier
  16. 数组的几个重要方法以及如何清空数组
  17. 安装Kibana报错[warning][admin][elasticsearch] Unable to revive connection: http://localhost:9200/
  18. Vue之表单rules
  19. 使用CocosStudioV3.10场景导入Cocos2d-xV3.17.2
  20. DEVC++中的 “万能头文件” <bits/stdc++.h>

热门文章

  1. c#如何嵌套第三方程序_C#程序演示嵌套条件运算符的示例
  2. Redis持久化的几种方式——深入解析RDB
  3. 计算机网络(第四章网络层)
  4. Python根据IP地址获取MAC地址
  5. 智慧职教云答案在哪里找_职教云网课答案在线查询,职教云答案查询,智慧职教云答案在哪里找到...
  6. 上机环境是什么意思_380元入手RX580满血显卡,跑分17万,还要什么自行车
  7. 关于java_关于Java基础
  8. linux密码带星号,Linux下实现输入密码以星号显示
  9. php 公众号验证回调方法_如何进行公众号文章收集 两种收集方法详解
  10. nessus安装_Nessus忘记密码怎么办?