要編寫線程安全的代碼,其核心在於要對狀態訪問操做進行管理,特別是對共享的(Shared)和可變的(Mutable)狀態的訪問。安全
** 一個對象是否須要使線程安全的,取決於它是否被多個線程訪問。這指的是在程序中訪問對象的方式,而不是對象要實現的功能。要使得對象是線程安全的,須要採用同步機制來協同對對象可變狀態的訪問。若是沒法實現協同,那麼可能會致使數據破壞以及其餘不應出現的結果。**線程
競態條件(Race condition):因爲不恰當的執行時序而出現不正確地結果 最多見的靜態條件就是「先檢查後執行」(可能致使經過一個失效的觀測結果來決定下一步的動做)對象
不要將「競態條件」與「數據競爭」相混淆,數據競爭是指,若是在訪問共享的非final類型的域沒有采用同步來進行協同,那麼就會出現數據競爭。生命週期
要保持狀態的一致性,就須要在單個原子操做中更新全部相關的狀態變量。同步
Java中的內置鎖(synchronized)是可重入的,即已得到鎖的線程能夠再次得到這個鎖。 對於可能被多個線程同時訪問的可變狀態變量,在訪問它時都須要持有同一個鎖,在這種狀況下,咱們稱狀態變量是由這個鎖保護的。 一種常見的錯誤認爲:只有在寫入共享變量時才須要使用同步。這是錯誤的。it