天天看點

線程安全性(第二章)

要編寫線程安全的代碼,其核心在于要對狀态通路操作進行管理,特别是對共享的(Shared)和可變的(Mutable)狀态的通路。

對象的狀态:存儲在狀态變量(例如執行個體或靜态域)中的資料,包括其他以來對象的域

共享(Shared):意味着變量可以由多個線程同時通路

可變(Mutable):變量的值在其生命周期内可以發生變化

一個對象是否需要使線程安全的,取決于它是否被多個線程通路。這指的是在程式中通路對象的方式,而不是對象要實作的功能。要使得對象是線程安全的,需要采用同步機制來協同對對象可變狀态的通路。如果無法實作協同,那麼可能會導緻資料破壞以及其他不該出現的結果。

線程安全性特例:無狀态類一定是線程安全的

競态條件(Race condition):由于不恰當的執行時序而出現不正确地結果

要保持狀态的一緻性,就需要在單個原子操作中更新所有相關的狀态變量。

Java中的内置鎖(synchronized)是可重入的,即已獲得鎖的線程可以再次獲得這個鎖。

對于可能被多個線程同時通路的可變狀态變量,在通路它時都需要持有同一個鎖,在這種情況下,我們稱狀态變量是由這個鎖保護的。

一種常見的錯誤認為:隻有在寫入共享變量時才需要使用同步。這是錯誤的。