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

前言

在最近的一些面试中,跟应聘者聊了比较多关于“同步/异步,阻塞/非阻塞”相关的话题,发现你们对于这些概念的理解都比较模糊,甚至有的同窗会反问“他们不就是同一个东西吗?”。因此借着这么一个机会,我想用一些尽可能简单的例子,尽可能简洁的语言来聊聊本身对于这些概念的见解。程序员

正文

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

同步阻塞

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

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

异步阻塞

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

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

同步非阻塞

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

那么这时候对于公交车(被调用着者)来讲,它是“同步“的。可是此时老王(调用者)能够在候车的时候去干其余的的事情,因此他是“非阻塞”的。编码

异步非阻塞

改革春风吹满地,新农村建设正在火热进行中,此时的乡下,公交车里面也安装了车辆到站的提醒广播。如今老王在候车的时候,能够安心的跟小花叙旧了,当听到本身须要乘坐的车辆到站广播时,才过去车站上车。spa

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

概念总结

从上面的示例中,咱们能够明白一件事情,同步异步,阻塞非阻塞他们针对的对象是不同的。对于调用者来讲是阻塞跟非阻塞,被调用者是同步跟异步。

同步: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异常处理最佳实践及陷阱防范
论JVM爆炸的几种姿式及自救方法
女友也能看懂的Zookeeper分布式锁原理
解放程序员双手之Supervisor

有收获的话,就点个赞吧

关注「深夜里的程序猿」,分享最干的干货

相关文章
相关标签/搜索