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