李建輝
引言:在Java語言程序設計中, 多線程的并發執行可以提高程序的運行效率,但是,當多線程去訪問同一個資源時,可能會引發安全問題,特別是用到線程休眠的時候,容易出現安全問題,為了解決這樣的問題,第一盡量不要使用線程休眠,第二種方法是使用線程同步,限制某個資源在同一時刻只能被一個線程去訪問。
一、程序示例1
我們寫一個簡單賣票程序,使用多線程去賣10張票,4個窗口賣10張票,我們給出第一個Java多線程程序代碼及運行結果:
運行結果:
窗口1-----賣出的票9 窗口3-----賣出的票8 窗口4-----賣出的票7 窗口1-----賣出的票6窗口2-----賣出的票5 窗口3-----賣出的票4 窗口4-----賣出的票3窗口2-----賣出的票2
窗口1-----賣出的票1 窗口3-----賣出的票0 窗口4-----賣出的票-1 窗口2-----賣出的票-2
結果分析:出現賣出的票0,-1,-2張票,很顯然不符合邏輯,原因在于線程休眠Thread.sleep(10)語句,當前線程進入休眠,但是CPU不會休息,馬上會調入其他線程來處理,可是當前線程并沒有處理完畢(賣出票),造成還有多余的票沒有賣完,并由其他線程去賣(出現0,-1,-2張票)。如果沒有線程休眠語句,運行結果符合邏輯,不會出現0,-1,-2張票。
二、程序示例2
同樣寫一個簡單的多線程賣票程序,使用線程同步來處理共享資源塊,使用Java關鍵字synchronized來寫一個同步方法來賣票,該同步方法在同一時刻只能由一個線程來訪問,其他線程等待,保證了資源的安全性。
結果分析:很顯然運行結果符合我們的邏輯。
三、Java多線程產生安全性問題總結
Java多線程產生的安全性問題,使用同步方法能解決很好的解決多線程安全問題,特別是解決了多線程同時訪問共享數據時產生的安全問題,這就需要我們在代碼設計上入手,養成良好的編碼習慣和規范。
參 考 文 獻
[1]傳智播客高教產品研發部 .java基礎入門.清華大學出版社
[2] Eric. Java編程思想[M]. 第4版. 機械工業出版社
[3]王保羅.Java面向對象程序設計[M]. 北京:清華大學出版社