我只是想开个饭店—— JavaIO模型的演变
Java的IO。。。真的是我所见过的高级语言中。最最复杂的。。。

看着这个图我也是醉了。
但是不知不觉间,java的IO已经更新到了NIO.2了,IO库早已经不止是这个样子了,那么这个过程中,它们经历了怎么样的变化呢?在了解Java的IO之前,我们先来看看几种模型。
咱就是提供独家服务
在jdk没有推出NIO之前,java使用的IO模型都是BIO(Block Input Output)模型。那么什么是BIO模型呢?
简单来说就是一对一的服务。好比新开了一家餐厅,来了一位客人,就买一张桌子放到餐厅里面去(应该没有这么蠢的老板吧。。orz.....),来了一千位客人,就放一千张桌子……
“我去,餐厅不够大啊。。。。怎么破?”
这个时候只能任性了……
“买买买!咱再租一个场地,开个新店!”
这就是传统的BIO模型,相当“任性”的模型,服务端会使用一个Acceptor线程监听客户端的连接,每当一个客户机向服务端发起一个链接,服务端就创建一个线程( Thread),当并发访问量增大,只能通过“买买买”的方法解决问题了。
那么问题来了,T^T.
“刚刚是做梦呢!我们真的好穷啊。”
开窍的老板
“咱搞个排号不就完事了么?”
咱就这么多桌子,事先都买好了,每次客人坐满了之后,之后来的客人只能在外面等着了(没办法,谁让咱的饭菜就是这么好吃!)。
这便是伪异步IO模型了。当客户端发起一个请求个服务端,服务端将请求封装成一个任务(Task)放入之前已经准备好的线程池(Thread Pool)。当并发请求数量超过线程池规定的大小时,迟一点发起的线程只能默默在队列中等待线程池中的资源了。
相比BIO模型,这个模型已经提升了很多性能了。
但是。。他还是伪异步IO模型!也许是名气太大了。越来越多的客人慕名而来。门口的等地区要挤爆了啊~~如果每桌的客户吃饭的时间又比较长(IO是阻塞的,需要等待IO执行完毕才会释放资源),咱根本hold不住啊!
是时候,展现我们的智慧了
我们更新了餐厅的排号系统,为了让有限的空间释放出最大的能量,我们也是蛮拼的。我们开始意识到客人是喜欢我们的食物的,那么让客人能及时地享用我们的食物才是最重要的(PM们,明确的需求分析很重要啊!)。
我们把排号系统放到了网上,大家可以点外卖啊。客人们事先点好需要的食物,我们把食物做好后送到客人面前(服务很贴心,有木有!)。在这个期间,客人们可以去做自己的事情,而不会因为等待时间过长而感到烦躁。
是的,这就是New IO,java在1.4版本之后,提供了新的IO库,当然在jdk1.7中,NIO已经被升级到NIO.2了。客户端发出请求后,请求会立即返回。当服务端准备好数据后,就会把数据送回客户端。(可以看下我上一篇的博客《Please Call Me NIO》)
总结
这里简单分析了几个IO模型,接下来,我会结合一些代码继续写几篇blog。
最后,但愿世界上没有这么无脑的餐厅~
我只是想开个饭店—— JavaIO模型的演变的更多相关文章
- JavaIO模型--装饰者模式
JavaIO体现出装饰者的设计模式 今天在学SparkRDD之前,听了一堂复习JavaIO的课,觉得讲得不错 Java的IO一直让我觉得一层一层的很麻烦,刚接触的时候,理不太清楚 只知道要分解为输入输 ...
- JAVA-IO模型(BIO,NIO,AIO)
基本概念 阻塞和非阻塞 阻塞是进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待, 直到有东西可读或者可写为止 非阻塞是如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等 ...
- 聊聊Netty那些事儿之从内核角度看IO模型
从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...
- 基本I/O模型与Epoll简介
5种基本的I/O模型:1)阻塞I/O ;2)非阻塞I/O; 3)I/O复用(select和poll);4)信号驱动I/O(SIGIO);5)异步I/O(POSIX.1的aio_系列函数). 操作系统中 ...
- 第3章 文件I/O(5)_五种I/O模型
6. I/O处理方式(5种I/O模型) 6.1 几个概念的辨析 (1)同步和异步 ①是访问数据的方式,主要是针对IO(资源.数据)而言的.关键在于I/O操作完成后,有没有提供通知机制. ②同步的IO, ...
- 开发分支管理模型之阿里AoneFlow
说到分支管理模型,令人最为熟悉的莫过于TrunkBased 和 GitFlow. TrunkBased 模型是持续集成思想所崇尚的工作方式,它由单个master分支和许多release分支组成,每个r ...
- 深度学习中的序列模型演变及学习笔记(含RNN/LSTM/GRU/Seq2Seq/Attention机制)
[说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![认真看图][认真看图] [补充说明]深度学习中的序列模型已经广泛应用于自然语言处理(例如机器翻 ...
- 从零搭建Pytorch模型教程(四)编写训练过程--参数解析
前言 训练过程主要是指编写train.py文件,其中包括参数的解析.训练日志的配置.设置随机数种子.classdataset的初始化.网络的初始化.学习率的设置.损失函数的设置.优化方式的设置. ...
- 自定义MVC框架---第一章
MVC基本介绍 介绍: mvc是一种编程思想,用来解决开发项目的时候,代码如何编写,项目如何架构的问题,更具体一点就是解决多人协同开发时,如何分工协作的问题,从而提升开发效率 举一个例子:有一个人想 ...
随机推荐
- 【ajax 提交表单】多种方式的注意事项
在业务中,可能因为表单内容过于庞大,字段过于繁杂,如果人为去拼接的话 ,需要耗费大量的时间和精力,与此同时,代码看上去也是冗余不堪. 所以,提交表单的时候如果能整个表单数据整体提交,那是非常开心的事情 ...
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
java日期格式大全 format SimpleDateFormat(转) SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH ...
- ListFragment源码 (待分析)
/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Versi ...
- 搭建selenium grid简单配置
1.使用selenium提供的服务端独立jar包 :服务端.客户端都是运行于java7环境. 2.启动hub: hub配置文件如下: Java -jar selenium-server-standal ...
- 爬虫研究-主要针对ali
公司一个同事想爬取ali的网页受挫,自己跟着尝试了下,发现存在anti-spdier.准备了解下反爬虫,看怎么处理ali. http://www.freebuf.com/news/topnews/96 ...
- 从零开始山寨Caffe·捌:IO系统(二)
生产者 双缓冲组与信号量机制 在第陆章中提到了,如何模拟,以及取代根本不存的Q.full()函数. 其本质是:除了为生产者提供一个成品缓冲队列,还提供一个零件缓冲队列. 当我们从外部给定了固定容量的零 ...
- 使用神经网络来识别手写数字【译】(三)- 用Python代码实现
实现我们分类数字的网络 好,让我们使用随机梯度下降和 MNIST训练数据来写一个程序来学习怎样识别手写数字. 我们用Python (2.7) 来实现.只有 74 行代码!我们需要的第一个东西是 MNI ...
- network issue troubleshooting
Today we troubleshooting a lot of network issue by using commands like: ping <ip>/<computer ...
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
- js数组操作总结
1.数组的检测 ECMAScript3 if(value instanceof Array){ //执行操作 } 假定单一全局环境,如果网页存在多个框架,多个window,Array具有不 ...