非線程安全會在多個線程對同一個對象的實例進(jìn)行并發(fā)訪問時產(chǎn)生,產(chǎn)生的后果就是臟讀,也就是取到的數(shù)據(jù)其實是被更改過的。而線程安全就是對獲得的實例變量的值進(jìn)行同步處理,不會出現(xiàn)臟讀的現(xiàn)象。
- 方法內(nèi)的變量為線程安全
方法內(nèi)部的私有變量,不存在非線程安全問題,這是由于每個線程都有各自的棧 - 實例變量非線程安全
如果兩個線程同時訪問一個沒有同步的方法 ,同時操作業(yè)務(wù)對象中的實例變量,則有可能出現(xiàn)非線程安全問題。 - 多個對象多個鎖
如果兩個線程訪問同一個類的兩個不同實例的相同名稱的同步方法,效果卻是異步方式執(zhí)行的。

圖片.png
- synchronized鎖重入
當(dāng)一個線程得到一個對象鎖后,再請求此對象鎖時是可以再次得到該對象的鎖的,這也證明在一個synchronized方法內(nèi)部調(diào)用本類的其他sychronized方法/塊時,是永遠(yuǎn)可以得到鎖的。 - 出現(xiàn)異常,鎖自動釋放
當(dāng)一個線程執(zhí)行的代碼出現(xiàn)異常時,其所持有的鎖會自動釋放
volatitle關(guān)鍵字
關(guān)鍵字vilatile的主要作用是使變量在多個線程間可見
volatile的作用是強(qiáng)制從公共堆棧中取得變量的值,而不是從線程私有棧中取得變量的值。線程安全包括可見性和原子性,volatile可以保證可見性,但不能保證原子性。