另外看這篇 http://www.cnblogs.com/dolphin0520/p/3916526.html
JAVA NIO是同步非阻塞io。同步和異步說(shuō)的是消息的通知機(jī)制,阻塞非阻塞說(shuō)的是線程的狀態(tài) 。
下面說(shuō)說(shuō)我的理解,client和服務(wù)器建立了socket連接:
1、同步阻塞io:client在調(diào)用read()方法時(shí),stream里沒(méi)有數(shù)據(jù)可讀,線程停止向下執(zhí)行,直至stream有數(shù)據(jù)。
阻塞:體現(xiàn)在這個(gè)線程不能干別的了,只能在這里等著
同步:是體現(xiàn)在消息通知機(jī)制上的,即stream有沒(méi)有數(shù)據(jù)是需要我自己來(lái)判斷的。
2、同步非阻塞io:調(diào)用read方法后,如果stream沒(méi)有數(shù)據(jù),方法就返回,然后這個(gè)線程就就干別的去了。
非阻塞:體現(xiàn)在,這個(gè)線程可以去干別的,不需要一直在這等著
同步:體現(xiàn)在消息通知機(jī)制,這個(gè)線程仍然要定時(shí)的讀取stream,判斷數(shù)據(jù)有沒(méi)有準(zhǔn)備好,client采用循環(huán)的方式去讀取,可以看出CPU大部分被浪費(fèi)了
3、異步非阻塞io:服務(wù)端調(diào)用read()方法,若stream中無(wú)數(shù)據(jù)則返回,程序繼續(xù)向下執(zhí)行。當(dāng)stream中有數(shù)據(jù)時(shí),操作系統(tǒng)會(huì)負(fù)責(zé)把數(shù)據(jù)拷貝到用戶空間,然后通知這個(gè)線程,這里的消息通知機(jī)制就是異步!而不是像NIO那樣,自己起一個(gè)線程去監(jiān)控stream里面有沒(méi)有數(shù)據(jù)!
作者:蕓蕓有度
鏈接:https://www.zhihu.com/question/27991975/answer/56432635
來(lái)源:知乎
著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)。
NIO 與傳統(tǒng)IO的測(cè)試,我也做過(guò)。兩者在普通文件的讀取時(shí),速度幾乎沒(méi)有差異。 更有趣的是,如果傳統(tǒng)IO,使用的得當(dāng)(比如使用BufferedInputStream、BufferedReader ),是很快的。如果NIO使用不當(dāng)(比如,我用MappedByteBuffer,將文件映射到內(nèi)存,Buffer的大小是文件的總長(zhǎng)度43M),速度是傳統(tǒng)IO的二十分之一。 引用IBM官方教程中的一句話,來(lái)解釋:
引用
在 JDK 1.4 中原來(lái)的 I/O 包和 NIO 已經(jīng)很好地集成了。 java.io. 已經(jīng)以 NIO 為基礎(chǔ)重新實(shí)現(xiàn)了,所以現(xiàn)在它可以利用 NIO 的一些特性。例如, java.io. 包中的一些類包含以塊的形式讀寫(xiě)數(shù)據(jù)的方法,這使得即使在更面向流的系統(tǒng)中,處理速度也會(huì)更快。**
可以看到,1.4后的IO經(jīng)過(guò)了集成。所以NIO的好處,集中在其他特性上,而非速度了: 1、分散與聚集讀取 2、文件鎖定功能 3、網(wǎng)絡(luò)異步IO
1、前言
在網(wǎng)絡(luò)編程中,阻塞、非阻塞、同步、異步經(jīng)常被提到。unix網(wǎng)絡(luò)編程第一卷第六章專門(mén)討論五種不同的IO模型,Stevens講的非常詳細(xì),我記得去年看第一遍時(shí)候,似懂非懂,沒(méi)有深入理解。網(wǎng)上有詳細(xì)的分析:http://blog.csdn.net/historyasamirror/article/details/5778378。我結(jié)合網(wǎng)上博客和書(shū)總結(jié)一下,加以區(qū)別,加深理解。
2、數(shù)據(jù)流向
網(wǎng)絡(luò)IO操作實(shí)際過(guò)程涉及到內(nèi)核和調(diào)用這個(gè)IO操作的進(jìn)程。以read為例,read的具體操作分為以下兩個(gè)部分:
?。?)內(nèi)核等待數(shù)據(jù)可讀
?。?)將內(nèi)核讀到的數(shù)據(jù)拷貝到進(jìn)程
詳細(xì)過(guò)程如下圖所示:

3、網(wǎng)絡(luò)IO模型詳細(xì)分析
常見(jiàn)的IO模型有阻塞、非阻塞、IO多路復(fù)用,異步。以一個(gè)生動(dòng)形象的例子來(lái)說(shuō)明這四個(gè)概念。周末我和女友去逛街,中午餓了,我們準(zhǔn)備去吃飯。周末人多,吃飯需要排隊(duì),我和女友有以下幾種方案:
?。?)我和女友點(diǎn)完餐后,不知道什么時(shí)候能做好,只好坐在餐廳里面等,直到做好,然后吃完才離開(kāi)。
女友本想還和我一起逛街的,但是不知道飯能什么時(shí)候做好,只好和我一起在餐廳等,而不能去逛街,直到吃完飯才能去逛街,中間等待做飯的時(shí)間浪費(fèi)掉了。這就是典型的阻塞。網(wǎng)絡(luò)中IO阻塞如下圖所示:

?。?)我女友不甘心白白在這等,又想去逛商場(chǎng),又擔(dān)心飯好了。所以我們逛一會(huì),回來(lái)詢問(wèn)服務(wù)員飯好了沒(méi)有,來(lái)來(lái)回回好多次,飯都還沒(méi)吃都快累死了啦。這就是非阻塞。需要不斷的詢問(wèn),是否準(zhǔn)備好了。網(wǎng)絡(luò)IO非阻塞如下圖所示:

?。?)與第二個(gè)方案差不多,餐廳安裝了電子屏幕用來(lái)顯示點(diǎn)餐的狀態(tài),這樣我和女友逛街一會(huì),回來(lái)就不用去詢問(wèn)服務(wù)員了,直接看電子屏幕就可以了。這樣每個(gè)人的餐是否好了,都直接看電子屏幕就可以了,這就是典型的IO多路復(fù)用,如select、poll、epoll。網(wǎng)絡(luò)IO具體模型如下圖所示:

?。?)女友不想逛街,又餐廳太吵了,回家好好休息一下。于是我們叫外賣(mài),打個(gè)電話點(diǎn)餐,然后我和女友可以在家好好休息一下,飯好了送貨員送到家里來(lái)。這就是典型的異步,只需要打個(gè)電話說(shuō)一下,然后可以做自己的事情,飯好了就送來(lái)了。linux提供了AIO庫(kù)函數(shù)實(shí)現(xiàn)異步,但是用的很少。目前有很多開(kāi)源的異步IO庫(kù),例如libevent、libev、libuv。異步過(guò)程如下圖所示:

4、同步與異步
實(shí)際上同步與異步是針對(duì)應(yīng)用程序與內(nèi)核的交互而言的。同步過(guò)程中進(jìn)程觸發(fā)IO操作并等待或者輪詢的去查看IO操作是否完成。異步過(guò)程中進(jìn)程觸發(fā)IO操作以后,直接返回,做自己的事情,IO交給內(nèi)核來(lái)處理,完成后內(nèi)核通知進(jìn)程IO完成。同步與異步如下圖所示:

5、阻塞與非阻塞
簡(jiǎn)單理解為需要做一件事能不能立即得到返回應(yīng)答,如果不能立即獲得返回,需要等待,那就阻塞了,否則就可以理解為非阻塞。詳細(xì)區(qū)別如下圖所示:
