来自:会点代码的大叔

首先,我们需要弄清楚几个概念:同步和异步,阻塞和非阻塞。

01

同步和异步

1. 同步

进程触发 IO 操作的时候,必须亲自处理;

比如你必须亲自去银行取钱。

2. 异步

进程触发 IO 操作的时候,可以不亲自处理,它把操作委托给 OS 处理,委托的时候需要告知数据的地址和大小,然后自己去做别的事情,当 IO 操作结束后会得到通知;

比如你把银行卡给我,让我帮你去银行取钱,你需要告诉我银行卡密码和取多少钱,我取完了之后把钱给你。

3. 总结

自己干就是同步,别人干就是异步。

02

阻塞和非阻塞

1. 阻塞

进程触发 IO 操作的时候,如果此时此时没办法读或者写,那么进程就一直等待,直到读写结束;

比如你去银行 ATM 取钱,前面有人在排队,那么就要一直等待,直到你取完钱;

2. 非阻塞

进程触发 IO 操作的时候,如果此时此时没办法读或者写,那么就先去做别的,等到有通知后,再继续读写;

比如你去银行柜台取钱,人比较多,那就先领一个号,等着叫到号再去对应的窗口办理业务;这里稍微有些不太恰当的是,我们等待的过程中,还得听着叫号。

3. 总结

我要等着不能做其他事就是阻塞,我不用等可以做其他事就是异步。

03

BIO

同步阻塞;一个请求过来,应用程序开了一个线程,等 IO 准备好,IO 操作也是自己干;

采用 BIO 模型的服务端,由一个独立的 Acceptor 线程负责进行监听;在 while(true) 循环中调用 accept() 方法,等待客户端的请求;

一旦接收到请求,就可以建立套接字开始进行读写操作,这时候不再接收其他的请求,直到读写完成;

为了让 BIO 能够同时处理多个请求,那么就需要使用多线程处理;当服务端接收到请求,就为客户端创建一个线程进行处理,处理完成后再做线程销毁;

不过因为一个请求就要启动一个线程,所以开销是比较大的,启动和销毁线程开销很大,而且每个线程都要占用内存,所以可以引入线程池,可以在一定程度上减少线程创建和销毁的开销;这也被叫做 伪异步 IO。

线程池维护着 N 个线程和一个消息队列;当有请求接入时,服务端将 Socket 作为参数传递到一个线程任务中进行处理;通过对线程池最大线程数和消息队列大小进行控制,所以就算访问量高于服务端的承载能力,也不会因为服务端的资源耗尽而导致宕机;

这个模型在 请求量不高的时候,效率还是不错的,而且也不需要考虑限流的问题(控制线程池的最大线程数量)。

04

NIO

同步非阻塞;不用等待 IO 准备,准备好了会通知,不过 IO 操作还是要自己干;NIO 是一种多路复用机制,利用单线程轮询事件,Channel 来决定做什么,避免连接数多的时候,频繁进行线程切换导致性能问题(Select 阶段阻塞)。

听到这里,很多人可能已经懵了...什么是多路复用?Channel又是啥?Select 阶段到底是什么阶段?这里我用白话解释一下。

NIO是面向缓冲区的,可以将数据读取到一个缓冲区,稍后进行处理。NIO 有几个核心概念:

1. Channel 和 Buffer

Channel 可以理解成一个双向流,或者理解成一个通道,Buffer 就是缓存区,或者你就把它看做是一块内存空间,数据可以从 Channel 流进 Buffer ,也可以从 Buffer 流进 Channel 。

Channel 有很多种实现,比如:FileChannel 是从文件中读写数据,SocketChannel 通过 TCP 读写网络中的数据等等。

Buffer 也有多重类型,比如:ByteBuffer、CharBuffer、IntBuffer等等,光看他们的名字就知道他们代表了不同的数据类型。

2. Selector

我们可以把 Selector 看做是一个管理员,可以管理多个 Channel , Selector 能够知道到哪个 Channel 已经做好了读写的准备。这样一个线程只要操作这个管理员就可以了,相当于一个线程可以管理多个 Channel;一旦监听到有准备好的 Channel,就可以进行相应的处理。

不过 Java 原生的 NIO 不好用,直到 Netty 的出现。

05

AIO

异步非阻塞;因为事情不是自己做,其实也没有阻塞一说(都是非阻塞);

AIO 是在 NIO 的基础上,引入异步通道的概念;NIO 是采用轮询的方式,不停地询问数据是否准备好了,准备好了就处理;AIO 是向操作系统注册 IO 监听,操作系统完成 IO 操作了之后,主动通知,触发响应的函数(自己不做,让操作系统来做)。

目前看,AIO 应该的还不是很广泛。

看过这篇文章之后,您是否对 BIO、NIO 和 AIO 有了初步的了解呢?如果有任何疑问,可以加我的个人微信讨论。

长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢

还搞不懂 Java NIO?快来读读这篇文章!相关推荐

  1. 面试还搞不懂Redis,快看看这40道面试题!| 博文精选

    作者| 程序员追风 责编 | Carol 出品 | CSDN云计算(ID:CSDNcloud) 近年来,微服务变得越来越热门,越来越多的应用部署在分布式环境中.常用的分布式实现方式之一就有 Redis ...

  2. 面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)

    Redis 面试题 1.什么是 Redis?. 2.Redis 的数据类型? 3.使用 Redis 有哪些好处? 4.Redis 相比 Memcached 有哪些优势? 5.Memcache 与 Re ...

  3. 搞懂Java分布式锁实现看这篇文章就对了

    2019独角兽企业重金招聘Python工程师标准>>> 前言: 随着微处理机技术的发展,人们只需花几百美元就能买到一个CPU芯片,这个芯片每秒钟执行的指令比80年代最大的大型机的处理 ...

  4. java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!

    点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! ​ 在介绍本书单之前,我想先问一下各位读者,你们之前对于Java并发编程的了解有多少呢.经过了1 ...

  5. 我就不信看完这篇你还搞不懂信息熵

    我就不信看完这篇你还搞不懂信息熵 https://mp.weixin.qq.com/s/7NrB0UtmELXD3UNO3C6jGA 让我们说人话!好的数学概念都应该是通俗易懂的. 信息熵,信息熵,怎 ...

  6. 都2039年了,还不会编译JDK源码?这篇文章该看看了~~

    文章目录 一.概述 二.环境准备 2.1 boot JDK 2.2 编译机器及依赖 三.JDK源码下载 四.编译过程 4.1 上传并解压源码 4.2 configure 4.3.make all 五. ...

  7. 女生就不适合学Java吗_女生不适合学java?给他看这篇文章,女生其实更适合学java,更好就业!...

    原标题:女生不适合学java?给他看这篇文章,女生其实更适合学java,更好就业! 女生适合学java吗?女生做IT怎么样 首先要表明我的观点,编程是不分男女,什么女生不适合学编程的说法,从客观上来说 ...

  8. java多线程图片压缩包_年轻人不讲武德,竟然还搞不懂JVM?求你们来看阿里Java开发岗的招聘要求吧!...

    最近有很多小伙伴吃了蚂蚁金服上市的酸柠檬,觉得马爸爸说的福报还是存在的.有人问我,进阿里到底难不难? 拜托,一画也没进去,我怎么知道? 但是,本着刨根问底的精神,小天搜索了很多阿里Java开发岗位的招 ...

  9. 年轻人不讲武德,居然还搞不懂JVM?求你们来看阿里Java开发岗的招聘要求吧

    ​重试 最近有很多小伙伴吃了蚂蚁金服上市的酸柠檬,觉得马爸爸说的福报还是存在的.有人问我,进阿里到底难不难? 拜托,小梦也没进去,我怎么知道? ​重试 但是,本着刨根问底的精神,小天搜索了很多阿里Ja ...

最新文章

  1. 炫彩流光按钮 html+css
  2. Numpy and Matplotlib
  3. java语言的主要的知识点
  4. Android 开发杂记
  5. Python连接MYSQL,并做查询操作
  6. Linux下安装Tomcat7
  7. kaldi语音识别实战pdf_语音识别相关工具和资料分享
  8. SYN 攻击原理以及防范技术
  9. HGAT-用于半监督短文本分类的异构图注意力网络
  10. 使用C语言计算utf-8字符串长度 和取子字符串-转
  11. Introduction to Computer Networking学习笔记(三):IP与子网掩码
  12. 超详细!JDK 8 下载、安装和环境配置(macOS 和 Windows 版本)
  13. MATLAB曲线平滑的办法
  14. RabbitMQ下载与安装
  15. php微信 api,PHP微信API接口类
  16. 统计学简介之一——统计量
  17. 应付一天(今天太累)附新东方考研5500词音频
  18. 【常用工具类】EasyExcel
  19. 拼多多被曝确定五一放假三天,网友:“这也砍一刀?”
  20. iframe 用法总结

热门文章

  1. Codeforces Round #698 (Div. 2)(A ~ F)6题全,超高质量题解)【每日亿题】2021/2/4
  2. (2017)第八届蓝桥杯大赛个人赛省赛(软件类) C/C++ 大学A组 题解(第八题包子凑数)
  3. 部署war包到阿里云liunx的tomcat时报错:zip END header not found
  4. android 7.0拷贝文件,Android 7.0应用间共享文件----FileProvider
  5. android ble5.0添加扫描过滤,bluetooth-lowenergy
  6. 物体掉落速度_俄专家称青海火流星是个“飞船大的物体”,能量堪比万吨炸药爆炸...
  7. MYSQL的初级使用
  8. iOS - XML 数据解析
  9. “惊群”,看看nginx是怎么解决它的
  10. .NET Reflector反编译的方法