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