廣州東華職業學院軟件工程學院 廣東 廣州 510000
如今,Java多線程編程在很多軟件開發設計中得到了普遍應用,它不僅在多處理計算機系統中可以實現多個線程并行執行,充分利用多處理技術提高程序的執行效率,而且還可以提高系統資源的利用率。但是,在Java多線程編程過程中,由于同時有多個線程并發執行,有時會帶來嚴重的問題,甚至引發錯誤。例如由于資源共享而容易導致的數據安全問題。因此,深入探討并研究Java多線程編程中的數據安全,確保數據的有效性是十分重要的。
線程:
(1)線程的概念
程序:是一段靜態的代碼,是為完成特定任務,用某種語言編寫的一組指令的集合。
進程:是程序的一次執行過程,對應從代碼的加載、執行至執行完畢的一個完整過程。
線程:是程序中一個單一的順序控制流程,它是程序運行的基本執行單元。
線程是比進程還小的單位。線程有它自己的入口和出口,以及一個順序執行的序列。線程不能獨立存在,必須存在于進程中。
(2)Java多線程的實現

多線程編程模型仍是目前計算機架構最重要的模型,作為系統應用程序要發揮CPU的最大性能,就是要改變多線程編程模型為主的并行處理系統和并發式應用程序。多線程編程的目的就是最大限度地利用CPU 資源,提高程序執行效率。
Java的多線程機制能夠很方便地創建和運行多個獨立線程的程序,并且可以創建多個同步線程,實現多個任務的同步執行,這一機制對實現資源共享、防止“死鎖”程序的出現極為有用。
在實際應用中,一個程序往往要并發處理多個任務。例如在實際網絡應用中,一個服務器程序同一時刻不可能只對一個用戶服務,一個優秀的網絡服務程序必須能夠同時響應多個用戶請求,實現并發服務。
Java多線程機制的基本特征就是多個線程并發運行,各線程之間可能會共享資源,也可能要相互合作共同完成某一項任務,那么如何控制這些多線程在具體運行的過程中不產生沖突,是多線程編程過程中必須解決的問題,否則可能會導致程序運行的結果不正確,甚至造成死鎖問題。
在多線程程序中,由于同時有多個線程并發執行,會造成訪問沖突,使應用程序中數據的一致性被破壞。因此,必須保證數據的有效性和一致性。下面從幾種具體情況分析討論基于Java多線程編程中可能出現的數據安全問題[1]。
雖然在普遍Java應用程序中,對于普通變量、類成員變量、靜態變量等可以選擇使用訪問權限修飾符public、protected和private 等來控制對變量的訪問。但是在Java多線程程序中,這些常規的數據保護措施將不能有效地保護數據安全。例如:

程序運行結果為:
線程Thread-0 中的成員變量str為:null。
線程Thread-1 中的成員變量str為:null從結果上看,與理想值不符,發生這種情況的原因是當線程對象t1調用start()方法后就立刻輸出了str 的值,而這里run()方法還沒有執行到為str 賦值的語句。
要避免這種情況的發生,就需要等run()方法執行完后才執行輸出str的代碼。這就是Java多線程程序的異步執行機制造成的數據安全問題。這種情況下,可以通過使用Thread 類的join()方法解決,join()方法的作用是等待線程執行完畢,從執行效果上看,使得線程從異步執行變成同步執行,而當線程變成同步執行后,普通對象中的數據就安全了。改進后的程序代碼如下:
程序運行結果為:
線程Thread-0 中的成員變量str 為:這是成員變量的數據線程Thread-1 中的成員變量str 為:這是成員變量的數據顯然,程序運行結果與理想值是一致的,也就是說線程對象中的數據是安全的。

在多線程程序的執行過程中,對于多個并發執行的線程,如果它們之間存在相互依賴或者次序上的關系,這就要求多線程之間有效通信、相互協調,共同完成某項任務。因此,在實現線程間的相互通信時,保證線程交互中相關數據安全是很關鍵的[2]。
通過對Java多線程并發機制的深入分析與探討進一步理解了Java多線程程序中的數據安全問題,指出了在利用Java多線程技術進行實際編程過程中容易出現的數據安全問題以及相應的解決方法,并結合實例分析說明如何采用最佳的編碼方案來解決Java多線程編程中的數據安全問題。在應用程序的實際開發設計過程中,合理、有效地利用多線程編程,可以更加充分地利用計算機系統資源、提高程序性能及運行效率。