廣州東華職業(yè)學(xué)院軟件工程學(xué)院 廣東 廣州 510000
如今,Java多線程編程在很多軟件開發(fā)設(shè)計中得到了普遍應(yīng)用,它不僅在多處理計算機系統(tǒng)中可以實現(xiàn)多個線程并行執(zhí)行,充分利用多處理技術(shù)提高程序的執(zhí)行效率,而且還可以提高系統(tǒng)資源的利用率。但是,在Java多線程編程過程中,由于同時有多個線程并發(fā)執(zhí)行,有時會帶來嚴(yán)重的問題,甚至引發(fā)錯誤。例如由于資源共享而容易導(dǎo)致的數(shù)據(jù)安全問題。因此,深入探討并研究Java多線程編程中的數(shù)據(jù)安全,確保數(shù)據(jù)的有效性是十分重要的。
線程:
(1)線程的概念
程序:是一段靜態(tài)的代碼,是為完成特定任務(wù),用某種語言編寫的一組指令的集合。
進(jìn)程:是程序的一次執(zhí)行過程,對應(yīng)從代碼的加載、執(zhí)行至執(zhí)行完畢的一個完整過程。
線程:是程序中一個單一的順序控制流程,它是程序運行的基本執(zhí)行單元。
線程是比進(jìn)程還小的單位。線程有它自己的入口和出口,以及一個順序執(zhí)行的序列。線程不能獨立存在,必須存在于進(jìn)程中。
(2)Java多線程的實現(xiàn)
多線程編程模型仍是目前計算機架構(gòu)最重要的模型,作為系統(tǒng)應(yīng)用程序要發(fā)揮CPU的最大性能,就是要改變多線程編程模型為主的并行處理系統(tǒng)和并發(fā)式應(yīng)用程序。多線程編程的目的就是最大限度地利用CPU 資源,提高程序執(zhí)行效率。
Java的多線程機制能夠很方便地創(chuàng)建和運行多個獨立線程的程序,并且可以創(chuàng)建多個同步線程,實現(xiàn)多個任務(wù)的同步執(zhí)行,這一機制對實現(xiàn)資源共享、防止“死鎖”程序的出現(xiàn)極為有用。
在實際應(yīng)用中,一個程序往往要并發(fā)處理多個任務(wù)。例如在實際網(wǎng)絡(luò)應(yīng)用中,一個服務(wù)器程序同一時刻不可能只對一個用戶服務(wù),一個優(yōu)秀的網(wǎng)絡(luò)服務(wù)程序必須能夠同時響應(yīng)多個用戶請求,實現(xiàn)并發(fā)服務(wù)。
Java多線程機制的基本特征就是多個線程并發(fā)運行,各線程之間可能會共享資源,也可能要相互合作共同完成某一項任務(wù),那么如何控制這些多線程在具體運行的過程中不產(chǎn)生沖突,是多線程編程過程中必須解決的問題,否則可能會導(dǎo)致程序運行的結(jié)果不正確,甚至造成死鎖問題。
在多線程程序中,由于同時有多個線程并發(fā)執(zhí)行,會造成訪問沖突,使應(yīng)用程序中數(shù)據(jù)的一致性被破壞。因此,必須保證數(shù)據(jù)的有效性和一致性。下面從幾種具體情況分析討論基于Java多線程編程中可能出現(xiàn)的數(shù)據(jù)安全問題[1]。
雖然在普遍Java應(yīng)用程序中,對于普通變量、類成員變量、靜態(tài)變量等可以選擇使用訪問權(quán)限修飾符public、protected和private 等來控制對變量的訪問。但是在Java多線程程序中,這些常規(guī)的數(shù)據(jù)保護(hù)措施將不能有效地保護(hù)數(shù)據(jù)安全。例如:
程序運行結(jié)果為:
線程Thread-0 中的成員變量str為:null。
線程Thread-1 中的成員變量str為:null從結(jié)果上看,與理想值不符,發(fā)生這種情況的原因是當(dāng)線程對象t1調(diào)用start()方法后就立刻輸出了str 的值,而這里run()方法還沒有執(zhí)行到為str 賦值的語句。
要避免這種情況的發(fā)生,就需要等run()方法執(zhí)行完后才執(zhí)行輸出str的代碼。這就是Java多線程程序的異步執(zhí)行機制造成的數(shù)據(jù)安全問題。這種情況下,可以通過使用Thread 類的join()方法解決,join()方法的作用是等待線程執(zhí)行完畢,從執(zhí)行效果上看,使得線程從異步執(zhí)行變成同步執(zhí)行,而當(dāng)線程變成同步執(zhí)行后,普通對象中的數(shù)據(jù)就安全了。改進(jìn)后的程序代碼如下:
程序運行結(jié)果為:
線程Thread-0 中的成員變量str 為:這是成員變量的數(shù)據(jù)線程Thread-1 中的成員變量str 為:這是成員變量的數(shù)據(jù)顯然,程序運行結(jié)果與理想值是一致的,也就是說線程對象中的數(shù)據(jù)是安全的。
在多線程程序的執(zhí)行過程中,對于多個并發(fā)執(zhí)行的線程,如果它們之間存在相互依賴或者次序上的關(guān)系,這就要求多線程之間有效通信、相互協(xié)調(diào),共同完成某項任務(wù)。因此,在實現(xiàn)線程間的相互通信時,保證線程交互中相關(guān)數(shù)據(jù)安全是很關(guān)鍵的[2]。
通過對Java多線程并發(fā)機制的深入分析與探討進(jìn)一步理解了Java多線程程序中的數(shù)據(jù)安全問題,指出了在利用Java多線程技術(shù)進(jìn)行實際編程過程中容易出現(xiàn)的數(shù)據(jù)安全問題以及相應(yīng)的解決方法,并結(jié)合實例分析說明如何采用最佳的編碼方案來解決Java多線程編程中的數(shù)據(jù)安全問題。在應(yīng)用程序的實際開發(fā)設(shè)計過程中,合理、有效地利用多線程編程,可以更加充分地利用計算機系統(tǒng)資源、提高程序性能及運行效率。