????????多線(xiàn)程編程卑雁,因?yàn)槎嗑€(xiàn)程執(zhí)行是由線(xiàn)程調(diào)度器來(lái)調(diào)度執(zhí)行码邻,所以在多線(xiàn)程共享同一數(shù)據(jù)的時(shí)候,會(huì)出現(xiàn)某些安全問(wèn)題套腹。
1.線(xiàn)程安全問(wèn)題
????????關(guān)于線(xiàn)程安全問(wèn)題绪抛,這里有一個(gè)經(jīng)典的例子來(lái)供我們說(shuō)明:銀行取錢(qián)問(wèn)題资铡。
????????????????銀行取錢(qián)的步驟:
????????????????????1.用戶(hù)輸入賬戶(hù)、密碼幢码,系統(tǒng)進(jìn)行驗(yàn)證笤休。
????????????????????2.用戶(hù)輸入取款金額
????????????????????3.系統(tǒng)判斷賬戶(hù)余額是否大于取款金額
????????????????????4.大于,取款成功蛤育,否則取款失敗。
????????基本流程為上述所說(shuō)葫松,邏輯上沒(méi)有什么問(wèn)題瓦糕,但是如果將此流程放在了多線(xiàn)程并發(fā)的場(chǎng)景中,可能會(huì)出現(xiàn)某些問(wèn)題腋么,下面我們用代碼來(lái)模擬一下場(chǎng)景(跳過(guò)1步驟):
????????很明顯咕娄,這里出現(xiàn)了問(wèn)題,賬戶(hù)余額居然變成了負(fù)數(shù)珊擂,這里多線(xiàn)程執(zhí)行出現(xiàn)了安全問(wèn)題圣勒,這個(gè)問(wèn)題可能出現(xiàn)的幾率很小,可能1000次只出現(xiàn)1次摧扇,但是這不是我們想要發(fā)生的錯(cuò)誤圣贸!
2.同步代碼塊
????????上述問(wèn)題中,是因?yàn)閞un()方法沒(méi)有同步的問(wèn)題扛稽,在其中一個(gè)線(xiàn)程還沒(méi)有執(zhí)行到對(duì)賬戶(hù)余額操作的時(shí)候吁峻,另一個(gè)線(xiàn)程執(zhí)行的時(shí)候,邏輯判斷中賬戶(hù)余額是沒(méi)有修改過(guò)的在张,導(dǎo)致了賬戶(hù)余額被修改了2次用含,造成了異常。
對(duì)此帮匾,我們可以使用同步代碼塊來(lái)處理啄骇,解決這個(gè)異常。
synchronized(obj){
….此處是需要同步的代碼
}
????????語(yǔ)法格式含義:
? ? ? ? ? ? ? ? ?obj為同步監(jiān)視器瘟斜,在線(xiàn)程開(kāi)始執(zhí)行同步代碼塊之前缸夹,需要獲得同步監(jiān)視器的鎖定。
????????邏輯:
? ? ? ? ? ? ? ? ?加鎖->修改完成->釋放鎖(任何時(shí)刻只能有一個(gè)線(xiàn)程獲得同步監(jiān)視器的鎖定)
修改上一節(jié)GetMoney代碼:
問(wèn)題解決螺句!
------------------------上一節(jié)“Java- 線(xiàn)程生命周期”----------------------------
------------------------下一節(jié)“Java-線(xiàn)程同步方法”----------------------------