1. 程式人生 > >【java並發編程實戰】第一章筆記

【java並發編程實戰】第一章筆記

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並發編程實戰】第一章筆記