如何學習Java的NIO?

互聯網Java架構

我們知道在生活中,等人是一件很煩的事,同樣,在代碼中等待(阻塞)不僅影響性能,降低效率,而且還極大的浪費資源!

在JAVA4之前,JAVA的IO模型為blocking IO(BIO),即阻塞IO,在連接建立後,如果沒有數據傳輸就會一直處於阻塞狀態,這時候從線程來看就處於休眠狀態,從CPU來看就是處於停滯狀態,極大的浪費CPU的計算能力,如果以這個模型開發應用服務器,則因為大量線程阻塞,佔用內存資源大,導致有效連接數很低,比如說一個JAVA線程佔用1m的內存,那麼一個8G的內存頂多支持8000個連接,這對動輒百萬玩家在線遊戲等長連接模型,肯定是不能處理的!


JAVA在4版本,引進了NIO(Non-Blocking IO),即非阻塞IO,如何才能做到非阻塞呢?

如果發起了幾千個連接,但是隻有幾個連接需要數據傳輸,使用BIO需要維持幾千個連接,但是NIO是事件觸發機制,啟動一個線程不斷的對連接進行循環,如果有需要數據傳輸的就進行處理,如果沒有,繼續循環,這樣只需要一個線程就能維持幾千的連接,內存消耗相比BIO十分的低!

既然NIO如此高效,那麼怎麼學習JAVA NIO呢?

1,明白NIO原理:BIO通常以字節流或者字符流進行數據傳輸,而NIO使用bufffer緩衝,channel管道,selector選擇器進行核心實現!

channel負責數據的傳輸,有不同的管道類型,比如文件管道FileChannel,一般從流(輸入或者輸出)獲取到管道(getChannel()方法)!

buffer作為數據的緩衝,能一次性大量的傳輸數據,避免了單個字節寫數據的低效率,通常buffer有容量capacity,數據總量limit,指向專屬位置position,記錄上次讀寫位置的標誌mark四個指標,對應相應的同名函數作為調用方法,實現對緩衝中數據指標的獲取,再使用put,get方法從緩衝區設置或者獲取數據!

掌握NIO相應的API!



2,學習netty:netty作為JAVA NIO的最流行框架,其思想被廣泛應用在諸如nginx,redis等著名的框架中,netty作為一個同步非阻塞IO模型,通過IO多路複用將需要處理的事件放入一個FIFO隊列,然後逐一處理,使用linux中的epoll模型,避免selector模型中對所有連接的輪詢,性能更加的高效!

學習netty將會打開一個高併發,高性能的大門,是網絡IO不可不學的模型!

3,自己練:仿照netty實現一個自己的io多路複用框架,或者高性能RPC框架,加深對nio的理解!

總的來說,NIO在對長連接方式的服務中,有著BIO難以企及的優秀性能,但是編程難度提升不少,所有可以根據需求做出最優的選擇,NIO就說到這,改天說下AIO,更多的技術分享,敬請關注。。。


分享到:


相關文章: