IO模型讲解

本文介绍了Java开发中的IO模型,包括阻塞IO(BIO)和非阻塞IO(NIO)两种模型。阐述了它们的工作原理、优缺点,并给出了具体的应用实例。

1 前言

对于网络中的IO模型,大多数人可能只是简单的了解下,而没有对于其进行深入的了解。该文章大致的讲解了java开发过程中
遇到的Io模型。

2 BIO

2.1 介绍

阻塞性IO,这种模型会通过一个独立的线程进行监听,当客户端请求一个连接后,服务端会产生一个线程对请求进行处理,处理完成后,返回响应给客户端,最后进行销毁。同时,这种模型在线程进行处理请求时会阻塞当前线程,必须等待服务端处理完毕,关闭连接。

2.2 优点

  1. 处理起来相对比较简单,只需要创建线程处理请求即可。

2.3 缺点

  1. 当并发量增大之后,服务器需要对多个请求进行相应的线程处理,

2.4 例子

  1. Socket套接字,服务端需要创建SocketServer对端口进行监听,处理请求。
  2. java传统IO流。
  3. Tomcat的BIO阻塞模式。
    延伸:
    我们经常会在面试中被问到Spring是否是单例的,为什么默认是单例。因为之前大多Tomcat的模型大多是阻塞模型,在并发的情况下可能会导致线程
    不安全的情况。当使用NIO模型时,这种情况也就不会发生了。

3 NIO

3.1 介绍

  1. 传统的阻塞IO使用的是流,例如字节流,字符流,在这种情况下,线程必须阻塞到流处理完毕。而NIO处理的是缓冲区.
    其实缓冲区只是个对象数组而已。在NIO中,所有的数据都是从缓冲区读的,所有数据也是写到缓冲区的。
  2. NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。

3.2 缓冲区问题

这边可能会有人问到?这个和传统IO的缓冲流BufferReader有什么区别。
1. 传统IO为什么要用缓冲区?
假设我们用字符流进行读取,只能一个一个字符进行读取。而如果使用了缓冲流,我们可以一行一行进行读取。
2. 那字符流向缓冲流进行转换的过程难道不是一个一个字符写入到缓冲流的对象数组中的吗?
看源码:

public AbstractStringBuilder append(char str[], int offset, int len) {
        if (len > 0)                // let arraycopy report AIOOBE for len < 0
            ensureCapacityInternal(count + len);
        System.arraycopy(str, offset, value, count, len);关注这句话
        count += len;
        return this;
    }

3 NIO由于缓冲区的存在可以做到非阻塞。

3.3 原理

NIO采用了多路复用器Selector,Selector会不断轮询注册在其上的channel。如果channel上发生了读或者写事件,这个channel就是就绪状态,
会被selector轮询出来,随后对这个channel进行处理。同时由于使用了epoll模型,只需要一个线程进行selector的轮询,做到了IO多路复用。

3.4 优点

  1. 增强了服务器处理高并发的能力,减少了系统负载。

3.5 缺点

  1. 调试难度复杂
  2. 实现比较麻烦。这方面不懂,嘻嘻~~

3.6 例子

  1. Tomcat的NIO模型。
  2. redis的单线程模型。
(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值