同步/异步、阻塞/非阻塞 说的是一回事儿吗?
同步/异步、阻塞/非阻塞 你能通俗易懂的讲清楚吗?
Java 中的 BIO、NIO、AIO 你了解吗?
Socket 编程你还会吗?
Linux 操作系统的 IO 模型你能讲讲吗?
01. 生活中的同步/异步、阻塞/非阻塞
程序猿有了孩子之后,从原来的劈柴喂马周游世界,就变成了撸码喂娃家里蹲蹲。
说起喂娃,不得不提小猿给孩子热奶的事情。给孩子喂奶,有些时候喝着喝着就凉了,要时不时给孩子热一热。
起初,由于带娃没有经验,小猿直接把奶瓶放进一个自制的温奶器(盛满开水的大碗里),然后一直摸着奶瓶来确定是否热好了。
1. 对于温奶器来说,它是「同步」的;
2. 由于热奶的时候,小猿其它的什么事儿都干不了,小猿被温奶器「阻塞」;
3. 这种场景称之为「同步阻塞」。
不过,在小猿热奶时,孩子嗷嗷待哺,小猿也开始涨姿势啦,热奶的空档开始去抚慰孩子饥饿的心灵,时不时的去摸一下奶瓶有没有热好。
1. 对于温奶器来说,它是「同步」的;
2. 由于小猿在热奶的空档,可以抚慰孩子饥饿的心灵,小猿被温奶器「非阻塞」;
3. 这种场景称之为「同步非阻塞」。
不过自制的温奶器确实不太智能,尤其是当老人一人在家带娃的时候,于是寻找智囊团寻求高招。
这不,在邻居萝卜妈妈的建议下,购置了一款既能控制温度,又能响铃提醒的智能温奶器。小猿把奶瓶放进去,设置好温度,奶热好后会自动响铃提醒,但是小猿还是习惯性的直勾勾的盯着温奶器,你说小猿是不是有点犯傻。
1. 对于温奶器来说,奶温好后会通知小猿,它是「异步」的;
2. 小猿还是被温奶器「阻塞」;
3. 这种场景称之为「异步阻塞」。
不过,小猿在怎么犯傻充楞,也抵不住孩子因饥饿而哇哇的哭声。于是小猿在智能温奶器温奶的空档,便开始跟孩子做小游戏、读读小猪佩奇,当听到智能温奶器的响铃提醒时,再去拿温好的奶喂孩子。
1. 对于温奶器来说,奶温好后会通知小猿,它是「异步」的;
2. 由于小猿在热奶的空档,可以陪孩子做游戏、读小猪佩奇,小猿被温奶器「非阻塞」;
3. 这种场景称之为「异步非阻塞」。
我们把小猿视作调用者,把温奶器视作被调用者,进行简单归档一下。
同步、异步说的是温奶器(被调用者)。同步指的是被调用者做完事情之后再返回的机制;异步指的是被调用者先返回,然后再做事情,做完之后再通知调用者的机制。
阻塞、非阻塞说的是小猿(调用者)。阻塞指的是调用者在等待消息时,其它什么都不做;非阻塞指的是调用者在等待消息时,去干了别的事情。
02. 业务研发中的同步、异步
不可缺失的注册场景。在注册环节,要进行姓名、证件号码的二要素实名认证,要等待实名认证 API 的响应结果,才能进行后续的注册环节,所以此种业务场景可以认为是同步设计。
如果做过支付相关的业务时,充值、提现等等很多涉及到 Money 的业务场景,API 调用时一般会返回处理中,那么调用者可以去做别的事情,可以依赖于相应的查询接口进行轮询;不过被调用者在业务处理完成后,一般也会再通知调用者处理之后的结果。此种业务场景的设计,可以认为是异步设计。
简单归纳一下,纯属一家之言,不喜也请喷。
同步设计,Moudle1 调用 Moudle2,Moudle2 的处理是同步的,在处理完之前不会告诉 Moudle1,只有处理完之后才会告诉 Moudle1。
异步设计,Moudle1 调用 Moudle2,Moudle2 的处理是异步的,Moudle2 在接到请求后,先告诉 Moudle1 已经接到请求,然后异步去处理,处理完再通过通知的方式通知 Moudle1。
03. Java 中的 IO(BIO、NIO、AIO)
IO 顾名思义就是 input(输入),output(输出)。
在业务研发中,只要定义好输入输出,其它一切只是时间问题 —— 个人愚论。
在 Java 中 IO 模型有三种,分别是 BIO(同步阻塞 IO)、NIO(同步非阻塞 IO)、AIO(异步非阻塞 IO)。
聪明的你肯定会发现,在 Java 中的确是不存在,像小猿那种傻傻盯着智能温奶器,其它啥事儿也不干的异步阻塞的傻模型。
那么,Java 中的 BIO、NIO、AIO 说的是什么呢?先画个脑图给大家,下期我们将结合代码进行讲解。
更多精彩,咱们且听下次分解。
以上属于一家之言,如果你若喜欢,欢迎转发或在看。