synchronized的使用總結

2021-07-11 02:24:18 字數 1368 閱讀 7936

synchronized的基本使用規則可總結為以下3條。

1. 當乙個執行緒訪問「某物件」的「synchronized方法」或者「synchronized**塊」時,其他執行緒對「該物件」的該「synchronized方法」或者「synchronized**塊」的訪問將被阻塞。

2. 當乙個執行緒訪問「某物件」的「synchronized方法」或者「synchronized**塊」時,其他執行緒仍然可以訪問「該物件」的非同步**塊。

3. 當乙個執行緒訪問「某物件」的「synchronized方法」或者「synchronized**塊」時,其他執行緒對「該物件」的其他的「synchronized方法」或者「synchronized**塊」的訪問將被阻塞。

synchronized對應例項鎖,static synchronized對應全域性鎖。

例項鎖– 鎖在某乙個例項物件上。如果該類是單例,那麼該鎖也具有全域性鎖的概念。

全域性鎖– 該鎖針對的是類,無論例項多少個物件,那麼執行緒都共享該鎖。

關於「例項鎖」和「全域性鎖」有乙個很形象的例子:

pulbic class something 

public synchronized void issyncb(){}

public static synchronized void csynca(){}

public static synchronized void csyncb(){}

}

假設,something有兩個例項x和y。分析下面4組表示式獲取的鎖的情況。

(a) x.issynca()與x.issyncb()

(b) x.issynca()與y.issynca()

(c) x.csynca()與y.csyncb()

(d) x.issynca()與something.csynca()

分析結果:

a. 不能被同時訪問。因為issynca()和issyncb()都是訪問同乙個物件(物件x)的同步鎖。

b. 可以同時被訪問。因為訪問的不是同乙個物件的同步鎖,x.issynca()訪問的是x的同步鎖,而y.issynca()訪問的是y的同步鎖。

c. 不能被同時訪問。因為csynca()和csyncb()都是static型別,x.csynca()相當於something.issynca(),y.csyncb()相當於something.issyncb(),因此它們共用乙個同步鎖,不能被同時反問。

d. 可以被同時訪問。因為issynca()是例項方法,x.issynca()使用的是物件x的鎖;而csynca()是靜態方法,something.csynca()可以理解對使用的是「類的鎖」。因此,它們是可以被同時訪問的。

執行緒 synchronized的使用

synchronized public class sync override public void run public void pf int i catch interruptedexception e system.err.println i new date gettime public...

使用 synchronized指令

使用 synchronized指令 synchronized 指令是在 objective c 中建立乙個互斥鎖非常方便的方法。synchronized 指令做和其他互斥鎖一樣的工作 它防止不同的執行緒在同一時間獲取同乙個鎖 然而在這種情況下,你不需要直接建立乙個互斥鎖或鎖物件。相反,你只需要簡單的...

執行緒同步的使用(synchronized)

執行緒同步結論 當多個執行緒共同修改同乙個資源時使用執行緒同步,乙個資源使用乙個同步鎖,盡量縮小同步塊內的 執行緒同步 執行緒同步的真實意思,其實是 排隊 幾個執行緒之間要排隊,乙個乙個對共享資源進行操作,而不是同時進行操作。你不一定要把同步鎖宣告為static或者public,但是你一定要保證相關...