日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java三種IO模型原理實例詳解

瀏覽:24日期:2022-09-01 13:45:01

Java中IO的模型分為三種,同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。

BIO【同步阻塞】

在JDK1.4出來之前,我們建立網絡連接的時候采用BIO模式,需要先在服務端啟動一個ServerSocket,然后在客戶端啟動Socket來對服務端進行通信,默認情況下服務端需要對每個請求建立一堆線程等待請求,而客戶端發送請求后,先咨詢服務端是否有線程相應,如果沒有則會一直等待或者遭到拒絕請求,如果有的話,客戶端會線程會等待請求結束后才繼續執行。

NIO【同步非阻塞】

NIO本身是基于事件驅動思想來完成的,其主要想解決的是BIO的大并發問題: 在使用同步I/O的網絡應用中,如果要同時處理多個客戶端請求,或是在客戶端要同時和多個服務器進行通訊,就必須使用多線程來處理。也就是說,將每一個客戶端請求分配給一個線程來單獨處理。這樣做雖然可以達到我們的要求,但同時又會帶來另外一個問題。由于每創建一個線程,就要為這個線程分配一定的內存空間(也叫工作存儲器),而且操作系統本身也對線程的總數有一定的限制。如果客戶端的請求過多,服務端程序可能會因為不堪重負而拒絕客戶端的請求,甚至服務器可能會因此而癱瘓。

NIO基于Reactor,當socket有流可讀或可寫入socket時,操作系統會相應的通知引用程序進行處理,應用再將流讀取到緩沖區或寫入操作系統。 也就是說,這個時候,已經不是一個連接就要對應一個處理線程了,而是有效的請求,對應一個線程,當連接沒有數據時,是沒有工作線程來處理的。

BIO與NIO一個比較重要的不同,是我們使用BIO的時候往往會引入多線程,每個連接一個單獨的線程;而NIO則是使用單線程或者只使用少量的多線程,每個連接共用一個線程。

NIO的最重要的地方是當一個連接創建后,不需要對應一個線程,這個連接會被注冊到多路復用器上面,所以所有的連接只需要一個線程就可以搞定,當這個線程中的多路復用器進行輪詢的時候,發現連接上有請求的話,才開啟一個線程進行處理,也就是一個請求一個線程模式。

在NIO的處理方式中,當一個請求來的話,開啟線程進行處理,可能會等待后端應用的資源(JDBC連接等),其實這個線程就被阻塞了,當并發上來的話,還是會有BIO一樣的問題。

HTTP/1.1出現后,有了Http長連接,這樣除了超時和指明特定關閉的http header外,這個鏈接是一直打開的狀態的,這樣在NIO處理中可以進一步的進化,在后端資源中可以實現資源池或者隊列,當請求來的話,開啟的線程把請求和請求數據傳送給后端資源池或者隊列里面就返回,并且在全局的地方保持住這個現場(哪個連接的哪個請求等),這樣前面的線程還是可以去接受其他的請求,而后端的應用的處理只需要執行隊列里面的就可以了,這樣請求處理和后端應用是異步的.當后端處理完,到全局地方得到現場,產生響應,這個就實現了異步處理。

AIO【異步非阻塞】

與NIO不同,當進行讀寫操作時,只須直接調用API的read或write方法即可。這兩種方法均為異步的,對于讀操作而言,當有流可讀取時,操作系統會將可讀的流傳入read方法的緩沖區,并通知應用程序;對于寫操作而言,當操作系統將write方法傳遞的流寫入完畢時,操作系統主動通知應用程序。 即可以理解為,read/write方法都是異步的,完成后會主動調用回調函數。 在JDK1.7中,這部分內容被稱作NIO.2,主要在java.nio.channels包下增加了下面四個異步通道:

AsynchronousSocketChannelAsynchronousServerSocketChannelAsynchronousFileChannelAsynchronousDatagramChannel

其中的read/write方法,會返回一個帶回調函數的對象,當執行完讀取/寫入操作后,直接調用回調函數。

BIO是一個連接一個線程。 NIO是一個請求一個線程。 AIO是一個有效請求一個線程。

先來個例子理解一下概念

以銀行取款為例:

**同步 : **自己親自出馬持銀行卡到銀行取錢(使用同步IO時,Java自己處理IO讀寫); **異步 : **委托一小弟拿銀行卡到銀行取錢,然后給你(使用異步IO時,Java將IO讀寫委托給OS處理,需要將數據緩沖區地址和大小傳給OS(銀行卡和密碼),OS需要支持異步IO操作API); 阻塞 : ATM排隊取款,你只能等待(使用阻塞IO時,Java調用會一直阻塞到讀寫完成才返回); 非阻塞 : 柜臺取款,取個號,然后坐在椅子上做其它事,等號廣播會通知你辦理,沒到號你就不能去,你可以不斷問大堂經理排到了沒有,大堂經理如果說還沒到你就不能去(使用非阻塞IO時,如果不能讀寫Java調用會馬上返回,當IO事件分發器會通知可讀寫時再繼續進行讀寫,不斷循環直到讀寫完成)

Java對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模式,其中Reactor模式用于同步I/O,而Proactor運用于異步I/O操作。

在比較這兩個模式之前,我們首先的搞明白幾個概念,什么是阻塞和非阻塞,什么是同步和異步,同步和異步是針對應用程序和內核的交互而言的,同步指的是用戶進程觸發IO操作并等待或者輪詢的去查看IO操作是否就緒,而異步是指用戶進程觸發IO操作以后便開始做自己的事情,而當IO操作已經完成的時候會得到IO完成的通知。

而阻塞和非阻塞是針對于進程在訪問數據的時候,根據IO操作的就緒狀態來采取的不同方式,說白了是一種讀取或者寫入操作函數的實現方式,阻塞方式下讀取或者寫入函數將一直等待,而非阻塞方式下,讀取或者寫入函數會立即返回一個狀態值。

一般來說I/O模型可以分為:同步阻塞,同步非阻塞,異步阻塞,異步非阻塞

同步阻塞IO:在此種方式下,用戶進程在發起一個IO操作以后,必須等待IO操作的完成,只有當真正完成了IO操作以后,用戶進程才能運行。JAVA傳統的IO模型屬于此種方式! 同步非阻塞IO:在此種方式下,用戶進程發起一個IO操作以后邊可返回做其它事情,但是用戶進程需要時不時的詢問IO操作是否就緒,這就要求用戶進程不停的去詢問,從而引入不必要的CPU資源浪費。其中目前JAVA的NIO就屬于同步非阻塞IO。 異步阻塞IO:此種方式下是指應用發起一個IO操作以后,不等待內核IO操作的完成,等內核完成IO操作以后會通知應用程序,這其實就是同步和異步最關鍵的區別,同步必須等待或者主動的去詢問IO是否完成,那么為什么說是阻塞的呢?因為此時是通過select系統調用來完成的,而select函數本身的實現方式是阻塞的,而采用select函數有個好處就是它可以同時監聽多個文件句柄,從而提高系統的并發性! 異步非阻塞IO:在此種模式下,用戶進程只需要發起一個IO操作然后立即返回,等IO操作真正的完成以后,應用程序會得到IO操作完成的通知,此時用戶進程只需要對數據進行處理就好了,不需要進行實際的IO讀寫操作,因為真正的IO讀取或者寫入操作已經由內核完成了。目前Java中還沒有支持此種IO模型。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美成人一二区| 中文字幕色婷婷在线视频| 亚洲天堂久久| 日韩大片在线播放| 国产在线观看www| 日韩理论视频| 久久免费高清| 亚洲精品午夜av福利久久蜜桃| 国产一区二区三区日韩精品| 高清一区二区三区| 午夜影院一区| 五月激情久久| 免费视频一区三区| 鲁大师成人一区二区三区| 免费在线看一区| 日本不卡视频一二三区| 国产欧美一区二区三区米奇| 国产精品久久久久毛片大屁完整版| 国产乱子精品一区二区在线观看 | 国产精品流白浆在线观看| 69堂免费精品视频在线播放| 日韩欧美久久| 精品一区二区三区亚洲| 91免费精品| 欧美va亚洲va日韩∨a综合色| 99综合视频| 日韩欧美2区| 精品理论电影在线| 久久久久国产精品一区三寸| 五月综合激情| 日韩精彩视频在线观看| 国产精品qvod| 色偷偷色偷偷色偷偷在线视频| 999久久久免费精品国产| 在线国产一区| 日韩在线麻豆| 国产精品一区二区三区四区在线观看| 精品久久视频| 午夜日韩福利| 欧美日韩18| 亚洲风情在线资源| 丝袜美腿亚洲色图| 免费看久久久| 在线精品视频在线观看高清| 日本国产欧美| 亚洲最新无码中文字幕久久| 中日韩男男gay无套| 久久国产三级| 天堂av在线| 午夜电影一区| 国产一区二区色噜噜| 午夜在线精品偷拍| 九九九精品视频| 国产视频一区在线观看一区免费| 日韩av影院| 丝袜诱惑一区二区| 色综合视频一区二区三区日韩| 成年男女免费视频网站不卡| 中文字幕日韩欧美精品高清在线| 精品三级久久久| 丝袜美腿亚洲色图| sm捆绑调教国产免费网站在线观看| 99国产一区| 精品国产美女a久久9999| 伊人久久婷婷| 国产精品亚洲综合在线观看| 精品一区亚洲| 久久福利在线| 视频一区二区国产| 成人欧美一区二区三区的电影| 日韩国产一二三区| 美女毛片一区二区三区四区| 久久国产欧美日韩精品| 国产高清久久| 精品中国亚洲| 日韩不卡手机在线v区| 欧美一区三区| 美女久久99| 日韩在线观看一区二区三区| 蜜桃一区二区三区| 牛牛精品成人免费视频| 欧美福利专区| av综合电影网站| 国产精品密蕾丝视频下载| 91久久久久| 99精品在线免费在线观看| 国产欧美69| 精品久久国产一区| 久久天堂av| 国产一区二区三区91| 久久男女视频| 久久a爱视频| 亚洲精品极品| 精品一区在线| 久久激情中文| 国产美女精品视频免费播放软件| 黄色亚洲精品| 成人羞羞在线观看网站| 国产精品久久乐| 日本不卡视频一二三区| 首页欧美精品中文字幕| 国产精品久久久久av电视剧| 老司机精品视频在线播放| 日韩av中文字幕一区| 亚洲专区视频| 国产精品三上| 欧美日韩黑人| 亚洲www免费| 久久精品一区| 欧美日本一区| 美女久久一区| 麻豆久久精品| 最新日韩欧美| 国产精品日韩久久久| 精品在线播放| 伊人成人网在线看| 不卡一区2区| 国产一区清纯| 久久久影院免费| 亚洲h色精品| 精品日韩视频| 亚洲精品永久免费视频| 国模大尺度视频一区二区| 88久久精品| 日韩激情综合| 首页欧美精品中文字幕| 91国语精品自产拍| 亚洲韩日在线| 欧美a级一区| 午夜电影亚洲| 国产精品三上| 日韩中文字幕一区二区三区| 视频一区中文字幕国产| 日韩专区欧美专区| 蜜桃久久精品一区二区| 在线免费观看亚洲| 日韩精品一区二区三区中文在线 | 亚洲精品成人图区| 成人久久一区| 国产成人精选| 久久久国产精品一区二区中文| 色综合www| 国产视频亚洲| 日韩欧美久久| 麻豆视频久久| 天堂中文在线播放| 日韩午夜av在线| 亚洲18在线| 欧美精品成人| 日韩欧美另类一区二区| 91精品91| 91欧美极品| 国产一区二区三区精品在线观看| 日韩精品水蜜桃| 在线午夜精品| 人人爱人人干婷婷丁香亚洲| 国产精品国产三级在线观看| 国产一区二区亚洲| 性欧美69xoxoxoxo| 少妇精品在线| 精品欠久久久中文字幕加勒比| 久久免费高清| 日韩国产在线观看| av中文字幕在线观看第一页 | 精品美女久久| 久久久久免费av| 亚洲开心激情| 久久精品色播| 欧美日韩国产免费观看| 亚洲精品无播放器在线播放| 国产精品theporn| 久久久精品久久久久久96| 蜜臀av一区二区三区| 国产精品调教| 99久久久久国产精品| 日本综合精品一区| 深夜福利视频一区二区| 中文字幕中文字幕精品| 国产一区调教| 伊人久久大香伊蕉在人线观看热v| 91精品国产自产在线丝袜啪| 久久久久久一区二区| 蜜桃久久精品一区二区| 欧美国产视频| 日韩亚洲精品在线| 久久精品伊人| 久久亚洲色图| 国产精品不卡| 亚洲人成网77777色在线播放 | 国产一级成人av| 激情自拍一区| 国产日韩1区| 欧美日一区二区| 国产午夜一区| 日韩视频在线一区二区三区 | 激情综合自拍| 久久精品国产成人一区二区三区| 国产精品91一区二区三区| 国产日韩一区二区三免费高清| 欧美午夜精品一区二区三区电影|