JAVA-----BIO、NIO、AIO

一、基础知识

1、同步与异步

  • 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。

  • 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。

同步和异步的区别最大在于异步的话调用者不需要等待处理结果,被调用者会通过回调等机制来通知调用者其返回结果。

2、阻塞和非阻塞

  • 阻塞: 阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。

  • 非阻塞: 非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。

二、BIO、NIO、AIO 区别

  1. 同步阻塞BIO

    一个连接一个线程。

    JDK1.4之前,建立网络连接的时候采用BIO模式,先在启动服务端socket,然后启动客户端socket,对服务端通信,客户端发送请求后,先判断服务端是否有线程响应,如果没有则会一直等待或者遭到拒绝请求,如果有的话会等待请求结束后才继续执行。

  2. 同步非阻塞NIO

    一个请求一个线程。

    NIO主要是想解决BIO的大并发问题,BIO是每一个请求分配一个线程,当请求过多时,每个线程占用一定的内存空间,服务器瘫痪了。

    JDK1.4开始支持NIO,适用于连接数目多且连接比较短的架构,比如聊天服务器,并发局限于应用中。

  3. 异步非阻塞AIO

    一个有效请求一个线程。

    JDK1.7开始支持AIO,适用于连接数目多且连接比较长的结构,比如相册服务器,充分调用OS参与并发操作。

三、生活案例

  1. BIO(Blocking I/O):

    假如你是一个传统的服务员,当一个顾客点餐后,你会站在厨房门口等待厨师完成这个订单。在等待的过程中,你不能做其他事情,比如服务其他顾客。只有当这个订单完成后,你才能继续服务下一个顾客。这就是阻塞式I/O,服务员(I/O操作)在等待餐点完成的过程中被阻塞,无法进行其他操作。

  2. NIO(Non-blocking I/O):

    现在,你是一个更高效的服务员,当顾客点餐后,你会告诉厨师开始准备,然后立即转身去服务其他顾客。你不需要在厨房门口等待,而是可以同时处理多个订单。每隔一段时间,你会检查一下之前点的餐是否已经准备好。如果准备好了,你就去取餐并送到顾客桌上。这就是非阻塞式I/O,服务员(I/O操作)在等待餐点完成的过程中不会被阻塞,可以同时处理多个任务。

  3. AIO(Asynchronous I/O):

    假如你是一个拥有高科技设备的服务员,当顾客点餐后,你只需要将订单输入到一个智能系统中,然后就可以去做其他事情了。当餐点准备好后,系统会自动通知你,你只需要去取餐并送到顾客桌上。在这个过程中,你不需要不断检查餐点是否完成,系统会负责所有的监控和通知工作。这就是异步I/O,服务员(I/O操作)在提交了点餐请求后,可以完全去做其他事情,直到系统通知餐点已经准备好。

相关推荐
躺平大鹅2 分钟前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者1 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺1 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart2 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP3 小时前
MyBatis-mybatis入门与增删改查
java
孟陬7 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌7 小时前
一站式了解四种限流算法
java·后端·go
华仔啊7 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java
也些宝8 小时前
Java单例模式:饿汉、懒汉、DCL三种实现及最佳实践
java