Java BIO、NIO、AIO的区别

一、基础概念

同步:是指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪。

异步:是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知)。(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS) 

阻塞:是指当试图对该文件描述符进行读写时,如果当时没有东西可读,或者暂时不可写,程序就进入等待状态,直到有东西可读或者可写为止。

非阻塞:在非阻塞状态下,如果没有东西可读,或者不可写,读写函数马上返回,而不会等待。

二、BIO、NIO、AIO

Java BIO : 同步并阻塞。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

Java NIO : 同步非阻塞。服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

Java AIO(NIO.2) : 异步非阻塞。服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

三、使用场景

BIO、NIO、AIO适用场景分析:

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

四、I/O多路复用模式

两种I/O多路复用模式:Reactor模式和Proactor模式

一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有关的模式是Reactor和Proactor。

Reactor模式采用同步IO,而Proactor采用异步IO。


模拟的Reactor模式:

步骤 1) 等待事件 (Reactor 的工作)

步骤 2) 发"已经可读"事件发给事先注册的事件处理者或者回调 ( Reactor 要做的)

步骤 3) 读数据 (用户代码要做的)

步骤 4) 处理数据 (用户代码要做的)


模拟的Proactor模式:

步骤 1) 等待事件 (Proactor 的工作)

步骤 2) 读数据(看,这里变成成了让 Proactor 做这个事情)

步骤 3) 把数据已经准备好的消息给用户处理函数,即事件处理者(Proactor 要做的)

步骤 4) 处理数据 (用户代码要做的)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鹅厂后台开发工程师的工作日常

写在前面 :本故事纯属虚构,如有雷同,不负责任。为了整理 Linux 开发和日常使用的常用命令,想了好几天才串了这么个故事。虽然有点牵强,但是内容还是挺干的~欢迎大家点评。在很久很久以前,鹅厂开发类工程师职…

.NET Core开发的iNeuOS工业互联网平台,发布 iNeuDA 数据分析展示组件,快捷开发图形报表和数据大屏...

经过一段时间的努力,iNeuDA产品组件已经开发和测试完成,现在正式上线。现在iNeuOS工业互联网操作系统的技术体系和产品体系更佳完善,为中小企业提供更佳全面解决方案。如下图:iNeuDA 一站式大数据分析平台作为国内领先的新一代自助…

asp.net core 从 3.0 到 3.1

asp.net core 从 3.0 到 3.1Intro今天 .net core 3.1 正式发布了,.net core 3.1 正式版已发布,3.1 主要是对 3.0 的 bug 修复,以及一些小优化,而且作为 LTS 版本,建议大家升级。值得一提的是.net core 2.2 这个月就要寿…

Mac(OS X)必备软件

常有人说Mac上面软件少,没有Windows上面软件丰富,其实除了少数特定基于Windows平台的软件除外,其他软件都能在Mac上找到其相应版本或其他替代软件。本篇就Mac上常用软件做一下总结。 第一类:聊天/通讯 1、QQ QQ for Mac保留和QQ一…

身边的设计模式(三):抽象工厂 与 依赖注入

上篇文章,我们说到了简单工厂和工厂方法,如果没看过的,请先看上篇,不然的话,可能有些吃力,或者直接点击阅读原文,查看我博客园的对应详细版的文章。大家学到了这里,我建议自己可以练…

Java基础知识——Java集合详解

数组是Java很常见的一种数据结构,能够快速地进行存取。但是当遇到下面几种情况: ①我们需要存储的数据集数目是不定的 ②我们希望数据集能够自动排序 ③我们需要以键值对的方式存储数据 … 数组就不能满足我们的需求了。这时候,我们就需要使用…

边缘计算与云计算的不同,这篇说明白了!

术语“边缘计算”是指一种分布式计算,是将数据存储和计算带到需要它的站点或设备附近,这种分配设置消除了滞后时间并节省了带宽。与“物联网”相比,这是一种针对云环境的优化方法。它在数据源附近(即网络的“边缘”)处…

经典排序算法(12)——总结

一、排序算法简介 排序算法(Sorting algorithm)是一种能将一串数据,依照特定排序方式(依照其中的某个或某些关键字的大小)进行排列的一种算法。 常见的排序算法有:交换排序(冒泡排序、快速排序&…

在Asp.Net Core MVC 开发过程中遇到的问题总结

1. Q: Razor视图中怎么添加全局模型验证消息A&#xff1a;使用ModelOnly<div asp-validation-summary"ModelOnly" class"text-danger"></div>2.Q&#xff1a;树形表格&#xff0c;使用的是bootstrap-tablejquery.treegridA&#xff1a;效果参考…

为什么子线程中不能直接更新UI

点击上方“dotNET全栈开发”&#xff0c;“设为星标”加“星标★”&#xff0c;每天11.50&#xff0c;好文必达全文约4000字&#xff0c;预计阅读时间8分钟当初有同事就碰到类似的问题&#xff0c;于是就总结了一些&#xff0c;那时写这篇文章是我还在第一家公司。今天有人提到…

解决问题的能力 10倍程序员

大家好&#xff0c;我是Z哥。今天我们聊的话题对大多数人来说应该都算是一个“痛点”&#xff0c;就是怎么提高自己解决问题的能力。我们的工作中&#xff0c;每天会遇到大大小小的很多问题。其中有些是之前从未遇到过的问题&#xff0c;这对很多人来说就会很棘手&#xff0c;不…

.NET Core 3.1正式发布,还不赶快升级!

点击蓝字关注我们 .NET Core 3.1于2019年12月3日正式发布&#xff0c;这是一个长期支持&#xff08;LTS&#xff09;版本&#xff0c;并且将支持三年&#xff0c;这个版本对.NET Core的许多方面进行了改进&#xff0c;建议您尽快升级。 .NET Core 3.1 的变更日志很小。唯一新增…

.NET Core Blazor 1-Blazor项目文件分析

简介Blazor是一个使用.NET技术用于代替JavaScript/typescript的前端WEB框架。在前端开发中使用.NET语言进行书写逻辑有利于我们的性能、可靠性和安全性。并且对于使用.NET开发人员而言&#xff0c;全栈的成本更低。截止文章发布时&#xff0c;.NET Core已经发布了3.1版本&#…

除了HTML、CSS与JS,现在WASM也是标准Web语言

大家应该知道&#xff0c;万维网联盟 W3C 认证的 Web 语言有 HTML、CSS 与 JavaScript&#xff0c;而近日联盟正式宣布 WebAssembly 核心规范&#xff08;WebAssembly Core Specification&#xff09;成为官方 Web 标准&#xff0c;这意味着 WebAssembly 成为了第 4 种 Web 语言…

DDD实战与进阶 - 值对象

概述作为领域驱动设计战术模式中最为核心的一个部分-值对象。一直是被大多数愿意尝试或者正在使用DDD的开发者提及最多的概念之一。但是在学习过程中&#xff0c;大家会因为受到传统开发模式的影响&#xff0c;往往很难去运用值对象这一概念&#xff0c;以及在对值对象进行持久…

C# Lazy Loading

前言按需加载对象延迟加载实际是推迟进行创建对象&#xff0c;直到对其调用后才进行创建初始化&#xff0c;延迟&#xff08;懒加载&#xff09;的好处是提高系统性能&#xff0c;避免不必要的计算以及不必要的资源浪费。常规有这些情况&#xff1a;对象创建成本高且程序可能不…

将 WinForms 应用从 .NET Core 3.0 升级到 3.1

点击上方蓝字关注“汪宇杰博客”导语我作为社区里的“拖控件之王”&#xff0c;拖控件贼心不死&#xff0c;有时候会维护一些老项目&#xff0c;其中包括一个2004年的WinForms 软件。9月份的时候我曾经将它迁移到了 .NET Core 3.0&#xff0c;因为代码实现完全没动&#xff0c;…

戴明博士:管理的十四项原则

爱德华兹戴明博士&#xff08;Dr. W. Edwards Deming&#xff09;于1982年首版发行的《走出危机》(Out of The Crisis)一书中&#xff0c;提出了组织管理的14条基本原则。书中戴明博士认为&#xff1a;当时的美国企业多致力于追求短期利润&#xff0c;缺乏不断推出新产品及完善…

在Windows系统中构建还原ASP.NET Core 源码

大家好&#xff0c;这几天试着从Github上拉取AspNetCore的源码&#xff0c;尝试着通过Visual Studio 打开&#xff0c;但是并不尽人意。我们需要去构建我们拉去的源代码&#xff0c;这样才可以通过VisualStudio可还原的项目。毕竟AspNetCore是一个巨型的项目集。先决条件在Wind…