前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手教你同步阻塞IO与同步非阻塞IO

手把手教你同步阻塞IO与同步非阻塞IO

作者头像
鳄鱼儿
发布2024-06-10 08:28:34
780
发布2024-06-10 08:28:34
举报

上篇文章介绍了最基础的Socket 通信,本篇文章小鱼将继续就网络编程方向介绍下BIO 和NIO。

同步阻塞I/O(Blocking I/O)

同步阻塞I/O,即BIO,这是最常见的I/O模型。在这种模型中,发起I/O操作的线程会被阻塞,直到操作完成。这就意味着在数据准备好之前,线程不可以执行其他任务。

在 Java 的BIO 中,服务器由ServerSocket 负责绑定ip,并且启动监听端口,去等待客户端连接。

在客户端A 的Socket 实例发起请求连接操作后,ServerSocket 接受(accept())请求连接会产生一个socket 实例,这个socket 实例就只负责与客户端A 的Socket 实例进行通信。

有上诉我们可知:同步阻塞IO 阻塞发生主要在两个地方。

  • 服务器启动进入就绪状态后,主线程就需要等待客户端的接入,这个过程是阻塞的。
  • 在服务器与客户端建立连接后,socket 实例在没有接受到信息之前,线程也是处于阻塞状态。

同步非阻塞I/O(Non-blocking I/O)

在同步非阻塞I/O,即NIO,线程发起I/O请求后不会被阻塞,可以继续执行其他任务。

如果数据未准备好,I/O操作会立即返回,通常返回一个错误码表示操作不能立即完成。

在Java 中,NIO 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 BIO 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。

NIO 和 BIO 之间第一个最大的区别是:BIO 面向的是流,而 NIO 面向的是缓冲区。

BIO面向流的操作意味着数据是连续读取的,每次可以从输入流中读取一个或多个字节,直到所有数据被读取完毕。并且这些数据没有被缓存在任何地方,此外,BIO 不支持在流中前后移动数据。如果需要重新处理已读取的数据,必须先将数据存储到一个缓冲区中。BIO的面向流方法简单直观,易于理解和使用,但可能在处理大量数据或需要频繁访问数据时效率较低。

NIO 的缓冲导向方法略有不同,涉及到将数据首先读取到一个稍后处理的缓冲区中,然后需要时可以从缓冲区中前后移动处理数据,这就增加了处理过程中的灵活性。

但是,在NIO中,需要检查缓冲区是否包含所有需要处理的数据,可能需要额外的逻辑来确保数据的完整性和正确性。同时,在处理缓冲区数据时,需要确保新读取的数据不会覆盖尚未处理的旧数据。

BIO的面向流方法提供了简单的数据访问方式,但缺乏灵活性,且不支持数据的前后移动。相比之下,NIO的缓冲导向方法虽然增加了编程的复杂性,但提供了更高的灵活性和性能,特别是在需要高效处理大量数据的网络应用中。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 同步阻塞I/O(Blocking I/O)
  • 同步非阻塞I/O(Non-blocking I/O)
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档