另外看這篇 http://www.cnblogs.com/dolphin0520/p/3916526.html
JAVA NIO是同步非阻塞io。同步和異步說的是消息的通知機制媒至,阻塞非阻塞說的是線程的狀態(tài) 。
下面說說我的理解峦睡,client和服務器建立了socket連接:
1翎苫、同步阻塞io:client在調用read()方法時师脂,stream里沒有數(shù)據(jù)可讀乡数,線程停止向下執(zhí)行系奉,直至stream有數(shù)據(jù)。
阻塞:體現(xiàn)在這個線程不能干別的了惭嚣,只能在這里等著
同步:是體現(xiàn)在消息通知機制上的遵湖,即stream有沒有數(shù)據(jù)是需要我自己來判斷的悔政。
2晚吞、同步非阻塞io:調用read方法后,如果stream沒有數(shù)據(jù)谋国,方法就返回槽地,然后這個線程就就干別的去了。
非阻塞:體現(xiàn)在芦瘾,這個線程可以去干別的捌蚊,不需要一直在這等著
同步:體現(xiàn)在消息通知機制,這個線程仍然要定時的讀取stream近弟,判斷數(shù)據(jù)有沒有準備好缅糟,client采用循環(huán)的方式去讀取,可以看出CPU大部分被浪費了
3祷愉、異步非阻塞io:服務端調用read()方法窗宦,若stream中無數(shù)據(jù)則返回,程序繼續(xù)向下執(zhí)行二鳄。當stream中有數(shù)據(jù)時赴涵,操作系統(tǒng)會負責把數(shù)據(jù)拷貝到用戶空間,然后通知這個線程订讼,這里的消息通知機制就是異步髓窜!而不是像NIO那樣,自己起一個線程去監(jiān)控stream里面有沒有數(shù)據(jù)欺殿!
作者:蕓蕓有度
鏈接:https://www.zhihu.com/question/27991975/answer/56432635
來源:知乎
著作權歸作者所有寄纵,轉載請聯(lián)系作者獲得授權。
NIO 與傳統(tǒng)IO的測試脖苏,我也做過擂啥。兩者在普通文件的讀取時,速度幾乎沒有差異帆阳。 更有趣的是哺壶,如果傳統(tǒng)IO屋吨,使用的得當(比如使用BufferedInputStream、BufferedReader )山宾,是很快的至扰。如果NIO使用不當(比如,我用MappedByteBuffer资锰,將文件映射到內存敢课,Buffer的大小是文件的總長度43M),速度是傳統(tǒng)IO的二十分之一绷杜。 引用IBM官方教程中的一句話直秆,來解釋:
引用
在 JDK 1.4 中原來的 I/O 包和 NIO 已經(jīng)很好地集成了。 java.io. 已經(jīng)以 NIO 為基礎重新實現(xiàn)了鞭盟,所以現(xiàn)在它可以利用 NIO 的一些特性圾结。例如, java.io. 包中的一些類包含以塊的形式讀寫數(shù)據(jù)的方法齿诉,這使得即使在更面向流的系統(tǒng)中筝野,處理速度也會更快。**
可以看到粤剧,1.4后的IO經(jīng)過了集成歇竟。所以NIO的好處,集中在其他特性上抵恋,而非速度了: 1焕议、分散與聚集讀取 2、文件鎖定功能 3弧关、網(wǎng)絡異步IO
1盅安、前言
在網(wǎng)絡編程中,阻塞梯醒、非阻塞宽堆、同步、異步經(jīng)常被提到茸习。unix網(wǎng)絡編程第一卷第六章專門討論五種不同的IO模型畜隶,Stevens講的非常詳細,我記得去年看第一遍時候号胚,似懂非懂籽慢,沒有深入理解。網(wǎng)上有詳細的分析:http://blog.csdn.net/historyasamirror/article/details/5778378猫胁。我結合網(wǎng)上博客和書總結一下箱亿,加以區(qū)別,加深理解弃秆。
2届惋、數(shù)據(jù)流向
網(wǎng)絡IO操作實際過程涉及到內核和調用這個IO操作的進程髓帽。以read為例,read的具體操作分為以下兩個部分:
∧员(1)內核等待數(shù)據(jù)可讀
≈2亍(2)將內核讀到的數(shù)據(jù)拷貝到進程
詳細過程如下圖所示:
3、網(wǎng)絡IO模型詳細分析
常見的IO模型有阻塞瘩欺、非阻塞必盖、IO多路復用,異步俱饿。以一個生動形象的例子來說明這四個概念歌粥。周末我和女友去逛街,中午餓了拍埠,我們準備去吃飯失驶。周末人多,吃飯需要排隊械拍,我和女友有以下幾種方案:
⊥挥隆(1)我和女友點完餐后装盯,不知道什么時候能做好坷虑,只好坐在餐廳里面等,直到做好埂奈,然后吃完才離開迄损。
女友本想還和我一起逛街的,但是不知道飯能什么時候做好账磺,只好和我一起在餐廳等芹敌,而不能去逛街,直到吃完飯才能去逛街垮抗,中間等待做飯的時間浪費掉了氏捞。這就是典型的阻塞。網(wǎng)絡中IO阻塞如下圖所示:
∶鞍妗(2)我女友不甘心白白在這等液茎,又想去逛商場,又擔心飯好了辞嗡。所以我們逛一會捆等,回來詢問服務員飯好了沒有,來來回回好多次续室,飯都還沒吃都快累死了啦栋烤。這就是非阻塞。需要不斷的詢問挺狰,是否準備好了明郭。網(wǎng)絡IO非阻塞如下圖所示:
÷蚩摺(3)與第二個方案差不多,餐廳安裝了電子屏幕用來顯示點餐的狀態(tài)薯定,這樣我和女友逛街一會蔑祟,回來就不用去詢問服務員了,直接看電子屏幕就可以了沉唠。這樣每個人的餐是否好了疆虚,都直接看電子屏幕就可以了,這就是典型的IO多路復用满葛,如select径簿、poll、epoll嘀韧。網(wǎng)絡IO具體模型如下圖所示:
∑ぁ(4)女友不想逛街,又餐廳太吵了锄贷,回家好好休息一下译蒂。于是我們叫外賣,打個電話點餐谊却,然后我和女友可以在家好好休息一下柔昼,飯好了送貨員送到家里來。這就是典型的異步炎辨,只需要打個電話說一下捕透,然后可以做自己的事情,飯好了就送來了碴萧。linux提供了AIO庫函數(shù)實現(xiàn)異步乙嘀,但是用的很少。目前有很多開源的異步IO庫破喻,例如libevent虎谢、libev、libuv曹质。異步過程如下圖所示:
4婴噩、同步與異步
實際上同步與異步是針對應用程序與內核的交互而言的。同步過程中進程觸發(fā)IO操作并等待或者輪詢的去查看IO操作是否完成咆繁。異步過程中進程觸發(fā)IO操作以后讳推,直接返回,做自己的事情玩般,IO交給內核來處理银觅,完成后內核通知進程IO完成。同步與異步如下圖所示:
5坏为、阻塞與非阻塞
簡單理解為需要做一件事能不能立即得到返回應答究驴,如果不能立即獲得返回镊绪,需要等待,那就阻塞了洒忧,否則就可以理解為非阻塞蝴韭。詳細區(qū)別如下圖所示: