官术网_书友最值得收藏!

Chapter 1 第1章 緩沖區的使用

學習NIO能更加接近架構級的技術體系,對未來的職業發展有非常好的促進作用。

當你看到以上這段文字的時候,筆者要恭喜你,因為你正在往Java高性能、高并發、高吞吐量技術的道路上邁進,也就代表著未來是有可能將自己的職業規劃定位在Java高級程序員、Java資深工程師,以及技術經理、技術總監或首席技術官(CTO)這類職位上。這些職位對Java技術的掌握是有一定要求和標準的,至少筆者認為要將自己對技術的關注點從SSH、SSM分離出去,落腳在多線程、并發處理、NIO及Socket技術上,因為這些技術是開發Java高性能服務器必須要掌握的,甚至有些第三方的優秀框架也在使用這些技術。先不說自己開發框架,即使想要讀懂第三方框架的源代碼,也要掌握上面提到的多線程、并發處理、NIO及Socket這4種核心技術。當你正在進行SSH、SSM這類Web開發工作時,想要往更高的層次發展,筆者的其他兩本書《Java多線程編程核心技術》和《Java并發編程:核心方法與框架》,以及本書一定會帶給你非常大的幫助,因為這些內容是Java SE技術中的核心,是衡量一個Java程序員是否合格的明顯標志。

在正式開始介紹NIO之前,先簡要介紹一下Java SE中的4大核心技術:多線程、并發處理、Socket和NIO。如果你是這些技術的初學者,那么這將幫助你了解這些技術及其用途,以及它們的應用場景。

(1)多線程

可以這樣說,高性能的解決方案一定離不開多線程,它可以使1個CPU幾乎在同一時間運行更多的任務。在指定的時間單位內運行更多的任務,其實就是大幅度提高運行效率,讓軟件運行更流暢,處理的數據更多,以提升使用軟件時的用戶體驗。在Java中,使用Thread類來實現多線程功能的處理。在學習多線程時,要注意同步與異步的區別,也就是著重觀察synchronized關鍵字在不同代碼結構中的使用效果。另外,多線程的隨機性,以及多線程運行亂序的可控制性,這些都是在學習該技術時要著重掌握的。在學習Socket之前,建議先掌握多線程技術,因為使用Socket實現某些功能時是需要借助于多線程的。另外在面試時,多線程方面的知識點是被問及比較多的,可見該技術的重要程度。

推薦筆者的拙作《Java多線程編程核心技術》,封面如圖1-1所示。

圖1-1 Java多線程編程核心技術

(2)并發處理

你可以愉快地使用Thread類來學習編寫多線程的應用程序,但在真實的軟件項目開發中實現一些較復雜的邏輯時,其實并不是那么容易,因為多線程的隨機性、不方便控制性和調試麻煩等特性也許會給開發過程帶來麻煩,但好在Doug Lea開發的java.util.concurrent并發包提供了絕大多數常用的功能。concurrent并發包是對多線程技術的封裝,使用并發包中的類可以大幅度降低多線程代碼的復雜度。使用封裝好的API就可以實現以前使用幾十行甚至上百行才能實現的功能。使用并發包可以限制訪問的流量、線程間的數據交流,在同步處理時使用更加方便和高效率的鎖(Lock)對象、讀寫鎖對象,以及可以提高運行效率的線程池,支持異步及回調接口,支持計劃任務,支持fork-join分治編程,而且還提供了并發集合框架。上述功能都是Doug Lea的貢獻。只有真正地接觸到concurrent并發包,才能深刻地體會使用Thread類編程的原始性,會讓你的解題思路更加廣闊。

推薦筆者的拙作《Java并發編程:核心方法與框架》,封面如圖1-2所示。

圖1-2 Java并發編程:核心方法與框架

(3)Socket

高性能服務器的架構設計離不開集群,集群同樣離不開Socket。Socket技術可以實現不同計算機間的數據通信,從而實現在集群中的服務器之間進行數據交換,因此,Socket技術是必須要學習的,它也是工作、面試時經常涉及的知識點。即使你是一位Java語言Socket技術的初學者,如果有C++語言學習的經驗,那么在學習Socket技術時會覺得得心應手,因為Java語言中的Socket技術其實是封裝了操作系統中Socket編程的API,示例代碼如下:

JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByIndex0
  (JNIEnv *env, jclass cls, jint index)
{
    netif *ifList, *curr;
    jobject netifObj = NULL;
    //Retained for now to support IPv4 only stack, java.net.preferIPv4Stack
    if (ipv6_available()) {
        return Java_java_net_NetworkInterface_getByIndex0_XP (env, cls, index);
    }
    /* get the list of interfaces */
    if (enumInterfaces(env, &ifList) < 0) {
        return NULL;
    }
    /* search by index */
    curr = ifList;
    while (curr ! = NULL) {
        if (index == curr->index) {
            break;
        }
        curr = curr->next;
    }
    /* if found create a NetworkInterface */
    if (curr ! = NULL) {
        netifObj = createNetworkInterface(env, curr, -1, NULL);
    }
    /* release the interface list */
    free_netif(ifList);
    return netifObj;
}

上面的代碼片段出自:http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/73a9fef98b93/src/windows/native/java/net/NetworkInterface.c。

從上述代碼片段中可以發現,使用Java語言開發Socket軟件時,內部調用的還是基于操作系統的Socket的API。

如果沒有C++編程經驗,就不能學習Java中的Socket技術嗎?其實也不是,JDK已經將Socket技術進行了重量級的封裝,可以用最簡單的代碼實現復雜的功能,API接口設計得簡潔、有序,因此,即使不懂C++,也能順利地學習Socket編程。掌握C++語言其實是更有益于學習底層對Socket的封裝,研究一些細節問題時會應用到。在常規的學習時,掌握C++語言似乎就沒有這么大的幫助了。

Socket技術基于TCP/IP,提前了解一些協議的知識更有利于學習Socket。但是TCP/IP規范非常復雜,我們不可能把該協議的所有細節都掌握,只需要掌握TCP與UDP里常規的內容即可,因為這是Socket技術實現網絡通信主要使用的協議。是否有書籍把TCP/UDP的理論知識和Socket編程結合起來?真的有這樣的書,推薦《UNIX網絡編程(卷1):套接字聯網API》和《UNIX網絡編程(卷2):進程間通信》。這兩本書就將TCP/UDP/Socket進行整合并介紹,對TCP和UDP的細節進行文字講述,并且使用Socket API進行代碼的演示,但是演示的代碼使用的是C語言實現的,并不是Java,但Java程序員可以以這兩本書作為TCP/UDP理論知識的參考。如果你想更加深入、細致地研究TCP/IP編程,這兩本書會提供很大幫助。

Socket編程其實就是實現服務端與客戶端的數據通信,不管使用任何的編程語言,在實現上基本上都是4個步驟:①建立連接;②請求連接;③回應數據;④結束連接,這4個步驟的流程圖如圖1-3所示。

圖1-3 Socket編程流程圖

雖然圖1-3中使用C語言實現Socket編程,但同樣可以使用Java中的ServerSocket和Socket類來代替并實現網絡通信。本書中Socket的所有案例都是在這4個步驟的生命周期中再結合ServerSocket和Socket類產生的。

另外,本書是將NIO與Socket相結合的,在學習NIO之前,必須先學習Socket,因為NIO中的核心通道類都是基于Socket技術的通道類。學習Socket時要著重學習Socket Option特性,因為它會影響程序運行的效率。在網絡程序優化時,除了優化代碼之外,還要優化Socket Option中的參數。本書將Socket有關類中的API幾乎進行了全部講解,因為筆者不希望只列舉常用代碼,而其他知識點一帶而過或根本不介紹的情況發生。學習技術時就要以“全面覆蓋,某點深鉆”的方式進行全方位學習,這樣在閱讀第三方框架的源代碼時才不會出現現查API的情況,極大地提高了代碼閱讀效率,也會對TCP/IP編程有更深的認識。

(4)NIO

什么是NIO?百度百科中的解釋如圖1-4所示:

圖1-4 百度百科解釋的NIO

大致來講,NIO相比普通的I/O提供了功能更加強大、處理數據更快的解決方案,它可以大大提高I/O(輸入/輸出)吞吐量,常用在高性能服務器上。隨著互聯網的發展,在大多數涉及Java高性能的應用軟件中,NIO是必不可少的技術之一。

NIO實現高性能處理的原理是使用較少的線程來處理更多的任務,如圖1-5所示。

圖1-5 NIO高性能的核心原理圖

使用較少的Thread線程,通過Selector選擇器來執行不同Channel通道中的任務,執行的任務再結合AIO(異步I/O)就能發揮服務器最大的性能,大大提升軟件運行效率。

通過對前面4個核心技術的簡單介紹,至少你的思維中不再只是Struts、Spring、Hibernate、MyBatis、SpringMVC、CSS、jQuery、AJAX等這些Java Web技術了,而是需要思考如何組織軟件架構、服務器分布、通信優化、高性能處理等這些高級技能,為以后的學習和工作打下堅實的技術基礎。

學習NIO能更加接近和了解架構級的技術體系,對未來的職業發展有非常好的輔助作用。

主站蜘蛛池模板: 铜山县| 应用必备| 宜黄县| 屏南县| 安化县| 贵南县| 沿河| 瑞安市| 新乡县| 江西省| 通榆县| 张家川| 囊谦县| 兴海县| 宣恩县| 调兵山市| 明溪县| 光泽县| 朝阳区| 乡宁县| 越西县| 茂名市| 光山县| 保德县| 遂溪县| 娱乐| 板桥市| 虞城县| 壤塘县| 金门县| 惠来县| 葵青区| 湖南省| 新巴尔虎右旗| 兴城市| 望江县| 双柏县| 商都县| 京山县| 博罗县| 津南区|