博為峰小博老師:
[JVM利弊]
JVM 是把雙刃劍苍狰。它提供了統(tǒng)一的操作環(huán)境,讓 Java 程序員不用再為操作系統(tǒng)環(huán)境的區(qū)別而煩惱。與特定平臺相關(guān)的細(xì)枝末節(jié)大都被隱藏了起來,因而代碼寫得又快又容易财异。但是隱藏操作系統(tǒng)的技術(shù)細(xì)節(jié)也意味著某些個性鮮明、功能強(qiáng)大的特性被擋在了門外头遭。
怎么辦呢?如果您是程序員,可以使用 Java 本地接口(JNI)編寫本地代碼,直接使用操作系統(tǒng)特性碟婆。這樣的話过吻,不同的操作系統(tǒng)的局限性就體現(xiàn)出來了进泼。為了解決這一問題,java.nio 軟件包提供了新的抽象。具體地說,就是 Channel 和 Selector類纤虽。它們提供了使用 I/O 服務(wù)的通用 API,JDK 1.4 以前的版本是無法使用這些服務(wù)的。天下還是沒有免費(fèi)的午餐:您無法使用每一種操作系統(tǒng)的每一種特性,但是這些新類還是提供了強(qiáng)大的新框架,涵蓋了當(dāng)今商業(yè)操作系統(tǒng)普遍提供的高效 I/O 特性绞惦。不僅如此,java.nio.channels.spi還提供了新的服務(wù)提供接口(SPI),允許接入新型通道和選擇器,同時又不違反規(guī)范的一致性逼纸。
隨著NIO 的面世,Java已經(jīng)為嚴(yán)肅的商業(yè)、娛樂济蝉、科研和學(xué)術(shù)應(yīng)用做好了準(zhǔn)備杰刽。在這些領(lǐng)域,高性能 I/O 是必不可少的。
[NIO與IO的區(qū)別]
首先來講一下傳統(tǒng)的IO和NIO的區(qū)別王滤,傳統(tǒng)的IO又稱BIO贺嫂,即阻塞式IO,NIO就是非阻塞IO了雁乡。還有一種AIO就是異步IO第喳,這里不加闡述了。
Java IO的各種流是阻塞的踱稍。這意味著曲饱,當(dāng)一個線程調(diào)用read() 或 write()時,該線程被阻塞珠月,直到有一些數(shù)據(jù)被讀取扩淀,或數(shù)據(jù)完全寫入。該線程在此期間不能再干任何事情了啤挎。 Java NIO的非阻塞模式驻谆,使一個線程從某通道發(fā)送請求讀取數(shù)據(jù),但是它僅能得到目前可用的數(shù)據(jù),如果目前沒有數(shù)據(jù)可用時胜臊,就什么都不會獲取氛谜。而不是保持線程阻塞,所以直至數(shù)據(jù)變的可以讀取之前区端,該線程可以繼續(xù)做其他的事情值漫。 非阻塞寫也是如此。一個線程請求寫入一些數(shù)據(jù)到某通道织盼,但不需要等待它完全寫入杨何,這個線程同時可以去做別的事情。 線程通常將非阻塞IO的空閑時間用于在其它通道上執(zhí)行IO操作沥邻,所以一個單獨(dú)的線程現(xiàn)在可以管理多個輸入和輸出通道(channel)危虱。