天天看點

線程同步簡述

1:線程同步就是線程排隊。同步就是排隊。線程同步的目的就是避免線程“同步”執行。

2: “共享”這兩個字。隻有共享資源的讀寫通路才需要同步。如果不是共享資源,那麼就根本沒有同步的必要。

3:隻有“變量”才需要同步通路。如果共享的資源是固定不變的,那麼就相當于“常量”,線程同時讀取常量也不需要同步。至少一個線程修改共享資  源,這樣的情況下,線程之間就需要同步。

4:多個線程通路共享資源的代碼有可能是同一份代碼,也有可能是不同的代碼;無論是否執行同一份代碼,隻要這些線程的代碼通路同一份可變的共享資源,這些線程之間就需要同步。

5:同步鎖加在“通路共享資源的代碼段”上。這一點一定要記住,同步鎖是加在代碼段上的。

6:你不一定要把同步鎖聲明為static或者public,但是你一定要保證相關的同步代碼之間,一定要使用同一個同步鎖。

7:在Java裡面,同步鎖的概念就是這樣的。任何一個Object Reference都可以作為同步鎖。我們可以把Object Reference了解為對象在記憶體配置設定系統中的記憶體位址。是以,要保證同步代碼段之間使用的是同一個同步鎖,我們就要保證這些同步代碼段的 synchronized關鍵字使用的是同一個Object Reference,同一個記憶體位址。這也是為什麼我在前面的代碼中聲明lock1的時候,使用了final關鍵字,這就是為了保證lock1的 Object Reference在整個系統運作過程中都保持不變。

public static final Object lock1 = new Object();

… f1() {

synchronized(lock1){ // lock1 是公用同步鎖

  // 代碼段 A

// 通路共享資源 resource1

// 需要同步

}

}

8:我們要盡量避免這種直接把synchronized加在函數定義上的偷懶做法。因為我們要控制同步粒度。同步的代碼段越小越好。synchronized控制的範圍越小越好。

我們不僅要在縮小同步代碼段的長度上下功夫,我們同時還要注意細分同步鎖。