【java並發編程實戰】第一章筆記
阿新 • • 發佈:2018-08-23
ava 代碼 包含 時序 線程 test 原子性操作 形式 code
1.線程安全的定義
當多個線程訪問某個類時,不管允許環境采用何種調度方式或者這些線程如何交替執行,這個類都能表現出正確的行為
如果一個類既不包含任何域,也不包含任何對其他類中域的引用。則它一定是無狀態的對象,無狀態對象一定是線程安全的
2.競態條件
並發編程中,由於不恰當的執行時序導致不正確的結果。當某個計算結果的正確性取決於多線程交替執行時序時,就會發生競態條件。
常見的競態條件:
- 先檢查後執行。
讀取-修改-寫入
3.復合操作
為了避免產生競態條件,必須以原子的形式執行一組操作。
4.內置鎖(監視器鎖)
java提供了內置的原子性操作的鎖機制:同步代碼塊(synchronize),它包含兩部分,一個作為鎖的對象引用。一個作為由這個鎖保護的代碼塊。每個java對象都是自帶一個監視器鎖。線程進入獲取鎖,出來釋放鎖。
4.1 重入
定義:當某個線程請求由其他線程持有的鎖時,就會發生堵塞。但是內置鎖是可以重入的,當該線程嘗試或的鎖是已經由自己持有的,那麽該請求就會成功。重入意味著 鎖的粗粒度是線程而非調用。
如下代碼,如果內置鎖不可重入,下面的代碼就會發生死鎖。
public class SynchronizeTest extends superSynchronize { @Override public synchronized void superMethod1() { System.out.println("synchronized test "); super.superMethod1(); } public static void main(String[] args) { new SynchronizeTest().superMethod1(); } } class superSynchronize { public synchronized void superMethod1() { System.out.println("superMethod1 sybchronized"); } }
【java並發編程實戰】第一章筆記