`

Java NIO与IO的详细区别(通俗篇)

    博客分类:
  • Java
 
阅读更多

内核空间用户空间计算机体系结构计算机组成原理、……确实有点儿深奥。

 

我的新书《代码之谜》会有专门的章节讲解相关知识,现在写个简短的科普文:

 

就速度来说 CPU > 内存 > 硬盘

 

  • I- 就是从硬盘到内存
  • O- 就是从内存到硬盘

第一种方式:我从硬盘读取数据,然后程序一直等,数据读完后,继续操作。这种方式是最简单的,叫阻塞IO

 

第二种方式:我从硬盘读取数据,然后程序继续向下执行,等数据读取完后,通知当前程序(对硬件来说叫中断,对程序来说叫回调),然后此程序可以立即处理数据,也可以执行完当前操作在读取数据。

 

在以前的 Java IO 中,都是阻塞式 IO,NIO 引入了非阻塞式 IO。

 

还有一种就是同步 IO 和异步 IO。经常说的一个术语就是“异步非阻塞”,好象异步和非阻塞是同一回事,这大概是一个误区吧。

 

至于 Java NIO 的 Selector,在旧的 Java IO 系统中,是基于 Stream 的,即“流”,流式 IO。

 

当程序从硬盘往内存读取数据的时候,操作系统使用了 2 个“小伎俩”来提高性能,那就是预读,如果我读取了第一扇区的第三磁道的内容,那么你很有可能也会使用第二磁道和第四磁道的内容,所以操作系统会把附近磁道的内容提前读取出来,放在内存中,缓存

 

(PS:以上过程简化了)

 

通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

 

于是,NIO 横空出世。

200
37
分享到:
评论
38 楼 379855529 2017-01-16  
。。似乎重点没说NIO啊,前面基础只是铺垫的很好的,可是我要的你不给我~
37 楼 kun_hu 2014-05-07  
这就没了?
36 楼 ijlkdwg 2014-03-04  
shusansheng 写道
预读,在所有操作系统上都可以实现。 准确来说,是在 FS上实现的,Linux,windows都有,不知道奇葩的 macosx有没有。
另外,推荐楼上所有喷的人读一读 <大话数据存储>

又跑来一个不着调的。这个讨论的主题是NIO,就出现一个“预读”名词而已,你就忙不迭的来露个脸,说这个我知道啊,我知道啊,我是高手啊。顺便加一顶帽子给别人,不需要辩论就胜利了。好一副高手的嘴脸。除了盖帽子和装,你还会什么?前面的技术讨论很多,有料的就摆出来,要不就回家去发挥,那里有的是无知人给你哄骗。无论对错,是爷们就放开自己的观点说,别羞羞答答遮遮掩掩的。
顺便说下,对于专业里的技术问题,我很少看科普读物,特别是儿童版的。我不反对这个,科普读物自然有普及科学的用途,但我不怎么看。比如我的java知识,基本上来自google,上面有对有错,自己去判断思考,试验甄别。同事桌子上有大块头的think in java、java核心卷,偶尔翻翻,索然无味。Effective倒买了本,不知道扔到哪里了,英文版的pdf在桌面上,经常翻。我英文很烂,但是看这些就能忍得住。词霸是我电脑唯一的自动启动软件。
35 楼 shusansheng 2014-02-12  
预读,在所有操作系统上都可以实现。 准确来说,是在 FS上实现的,Linux,windows都有,不知道奇葩的 macosx有没有。
另外,推荐楼上所有喷的人读一读 <大话数据存储>
34 楼 在世界的中心呼喚愛 2014-01-23  
ijlkdwg 写道
nodejs 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!

你写的这两句话就比作者写的强了????真不知道iteye怎么会出来这种人!!

??
有事说事,别上来就含糊的盖什么帽子。
我观点里面哪个有问题,直接提。别搞的羞羞答答的假装不好意思。
别说现在所谓搞技术的,都玩虚的了。


请问下,硬件(或者计算机基础)知识怎么积累。。
有的东西,有心去学,实际工作中,没有用到。。。
我又很快忘记..
反反覆覆....
33 楼 flashing 2014-01-16  
nodejs 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

我很同意作者的观点,至于你说的也很对,但是不冲突。因为阻塞、非阻塞、异步、同步本来就是不同的概念。只是很多人往往误解,把异步和非阻塞等同起来,其实这是不对的。


看到有人回复我又仔细瞅了一眼原文,其实硬伤还是挺多的。
比如说预读的解释就是完全错误的,windows的确会预读,也会为高频率读取的文件做内存映射,但是磁道扇区。。。这是硬盘干的事儿好不好,而且存储不连续是正常现象,这个解释完全不靠谱,哪怕是比喻也是不靠谱的,更重要的是和nio没有半毛钱关系。
关于流的解释我是没看懂,其实楼主讲的看起来只是IO怎么缓存的概念而已,有缓存就有拷贝,性能就得下降一点,要不然要DMI干什么。这里仔细再看一遍,觉得完全是不知所云,虽然堆了几个高大上的名词。。。
32 楼 nodejs 2014-01-14  
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

我很同意作者的观点,至于你说的也很对,但是不冲突。因为阻塞、非阻塞、异步、同步本来就是不同的概念。只是很多人往往误解,把异步和非阻塞等同起来,其实这是不对的。
31 楼 nodejs 2014-01-14  
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!

你写的这两句话就比作者写的强了????真不知道iteye怎么会出来这种人!!
30 楼 artdialog 2014-01-14  
ijlkdwg 写道
justjavac 写道
ijlkdwg 写道
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。

我文中几时说过「磁盘读写速度」?

这个是你文字里面的:
==========================
通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

于是,NIO 横空出世。
==========================
是不是,这个可以总结为“NIO为了java读写磁盘的速度/效率”?或者你给另外一个简短总结。
理科的东西玩不转了,要玩文科的咬文嚼字了么?

满嘴喷粪的傻逼,JJC大大别和他一般见识,这种人见的多了。
29 楼 ijlkdwg 2014-01-14  
justjavac 写道
ijlkdwg 写道
justjavac 写道
ijlkdwg 写道
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。

我文中几时说过「磁盘读写速度」?

这个是你文字里面的:
==========================
通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

于是,NIO 横空出世。
==========================
是不是,这个可以总结为“NIO为了java读写磁盘的速度/效率”?或者你给另外一个简短总结。
理科的东西玩不转了,要玩文科的咬文嚼字了么?

可以总结为:读取的方式

要咬文嚼字也没问题:
你承认是“读取的方式”。
那么,你读取的宾语是什么,前面大块的文字是说磁盘吧。因此加上“磁盘”,就是“读取磁盘的方式”。
然后我们看后面的,技术是为了解决问题的,不是为了给某些人显摆的。你所谓的方式,最终是不是为了“效率速度”?
那么,你的总结,跟我的有什么区别???
顺便看了下你其它的几篇东西,多数是浅尝辄止,人云亦云。比如关于加密签名的那个东西,老外原文里面的确错了,他把签名的反过程说成解密了。但是你稍微考虑下,如果这样,为什么还有加密解密和签名验证俩个说法。这样也不会被他迷惑了。另外关于ssl的握手,google查询"ssl shakehand steps"或者"ssl 握手 过程"都可以找到很多。而这样的过程里面,每一步,你仔细考虑,都是非常有意义的。
很少逛国内站点,偶尔好心给人提醒,却这样的争论,到了咬文嚼字的地步。
技术的路,你这样的心态,不适合。
你继续去做你的高手去吧。
28 楼 justjavac 2014-01-13  
ijlkdwg 写道
justjavac 写道
ijlkdwg 写道
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。

我文中几时说过「磁盘读写速度」?

这个是你文字里面的:
==========================
通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

于是,NIO 横空出世。
==========================
是不是,这个可以总结为“NIO为了java读写磁盘的速度/效率”?或者你给另外一个简短总结。
理科的东西玩不转了,要玩文科的咬文嚼字了么?

可以总结为:读取的方式
27 楼 justjavac 2014-01-13  
ijlkdwg 写道
justjavac 写道
ijlkdwg 写道
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。

我文中几时说过「磁盘读写速度」?

这个是你文字里面的:
==========================
通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

于是,NIO 横空出世。
==========================
是不是,这个可以总结为“NIO为了java读写磁盘的速度/效率”?或者你给另外一个简短总结。
理科的东西玩不转了,要玩文科的咬文嚼字了么?

虽然不是全部,但这也是一个很重要的NIO场景啊!
26 楼 ijlkdwg 2014-01-13  
justjavac 写道
ijlkdwg 写道
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。

我文中几时说过「磁盘读写速度」?

这个是你文字里面的:
==========================
通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

于是,NIO 横空出世。
==========================
是不是,这个可以总结为“NIO为了java读写磁盘的速度/效率”?或者你给另外一个简短总结。
理科的东西玩不转了,要玩文科的咬文嚼字了么?
25 楼 justjavac 2014-01-13  
ijlkdwg 写道
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。

我文中几时说过「磁盘读写速度」?
24 楼 ijlkdwg 2014-01-13  
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。
23 楼 justjavac 2014-01-10  
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。
22 楼 Tyrion 2014-01-09  
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。
21 楼 flashing 2014-01-09  
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。
20 楼 kelly_zsl 2014-01-08  
分析很好,目前java(5.0+) 实现2中非阻塞io处理,polling机制和回调,必须要操作系统支持才可以的,
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!

19 楼 ijlkdwg 2014-01-08  
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!

相关推荐

    [ Java ] 最通俗易懂的 Java NIO 讲解

    文章目录IO 与 NIO 的比较通道和缓冲区缓冲区(buffer)通道(channel)使用 NIO 完成本地通信使用 NIO 完成网络通信管道 IO 与 NIO 的比较 IO NIO 面向流(Stream Oriented) 面向缓冲区(Buffer Oriented)...

    Java Netty技术研究

    远古: java.net + io java.net + iojava.net + java.iojava.net + java.iojava.net + java.iojava.net + java.iojava.net + java.io java.net + io java.net + io java.net + iojava.net + java.iojava.net + java....

    Java零基础学习视频通俗易懂

    10. **IO与NIO**:Java的IO流系统和非阻塞I/O(New IO,NIO)框架,包括通道(Channel)和缓冲区(Buffer)的概念。 11. **反射机制**:通过反射,程序在运行时可以获取类的信息(如类名、属性、方法等)并动态地...

    21天学通JAVA 更通俗意懂

    10. **IO和NIO**:JAVA的新IO(New IO)框架提供了一种更高效的数据传输方式,理解通道(Channel)和缓冲区(Buffer)的概念有助于编写高性能的IO程序。 11. **反射和注解**:JAVA的反射机制允许程序在运行时动态...

    通俗易懂的NIO教程(含配套资料)

    Java NIO 是 JDK 1.4 发布的一套全新的IO API(New IO 简称 NIO),由于 JDK 1.7 对 NIO 的更新,目前 NIO 被广泛应用,以至于将 JDK 1.7 的改动称为 NIO.2,NIO 可以替代传统的Java IO API。NIO与原来的IO有同样的...

    Java开发中名词的通俗解释共2页.pdf.zip

    这份名为“Java开发中名词的通俗解释共2页.pdf”的压缩文件,显然提供了一份简明扼要的Java编程术语解析,旨在帮助初学者或有经验的开发者更好地理解Java开发中的关键概念。虽然压缩包中似乎还有一个名为“赚钱项目...

    java入门与实例

    11. **文件和目录操作**:Java的`java.io`和`java.nio`包提供了丰富的API来处理文件和目录,如创建、删除、读写文件等。 12. **面向接口编程**:Java鼓励使用接口而非具体的实现,这样可以提高代码的灵活性和可扩展...

    韩顺平Java讲义94讲全

    6. **IO流与NIO**:讲解Java的输入输出流体系,包括字节流、字符流、缓冲流、对象序列化,以及新引入的非阻塞I/O(New IO,NIO)框架。 7. **网络编程**:Java提供了丰富的网络编程API,如Socket和ServerSocket,...

    JAVA 入门简易教材

    本教材是专为初学者设计的一份JAVA编程入门资料,以PDF格式呈现,旨在通过简洁明了的例子和通俗易懂的语言,帮助新手快速掌握JAVA编程基础。这份教程覆盖了JAVA语言的核心概念和常用技术,是您踏入JAVA世界的第一步...

    v3.0-JavaGuide面试突击版.pdf

    本资源摘要信息将为您提供一份详细的 Java 面试指南,涵盖了 Java 基础知识、集合框架、多线程、JVM、Java 面向对象编程、异常处理、IO 流、序列化和 Java 集合框架等方面的知识点。 一、Java 基础知识 1. Java 语...

    21天学通JAVA-en

    5. **IO流与NIO**:Java的输入/输出流系统,以及后来引入的新IO(NIO)机制,用于处理数据的读写,是进行文件操作和网络通信的重要部分。 6. **线程与并发**:Java提供了强大的多线程支持,学习线程的创建、同步和...

    java自学课件

    Java自学课件是一套全面而深入的教程,旨在引导初学者逐步掌握Java编程语言,从基础概念到高级特性,让学习者能够从零开始直至精通。这套课程的特点在于其教学方式的直观性和易理解性,它通过精确的语言阐述Java的...

    mini-course-app:此项目旨在帮助迷你课程管理

    Regusdevalidaçõesde enuda deusuáio; 乌干达情报资料; domidanédomínio; 西班牙语的通俗易懂的语言(无处不在的语言); 主修课程:学生,教授, MiniCourse ; Decisãodetransações,aquié...

Global site tag (gtag.js) - Google Analytics