1. 程式人生 > 其它 >synchronized 與static synchronized 的區別

synchronized 與static synchronized 的區別

synchronized是對類的當前例項進行加鎖,防止其他執行緒同時訪問該類的該例項的所有synchronized塊,注意這裡是“ 類的當前例項 ”,類的兩個不同例項就沒有這種約束了。那麼static synchronized恰好就是要控制類的所有例項的訪問了,static synchronized是限制執行緒同時訪問jvm中該類的所有例項同時訪問對應的程式碼塊。
class Test{
public synchronized void A(){}
public synchronized void B(){}
public static synchronized void SA(){}
public static synchronized void SB(){}
}
假如有Test類的兩個例項x,y
a. x.A()與x.B()

b. x.A()與y.A()

c. x.SA()與y.SB()

d. x.A()與Test.SA()
這裡,很清楚的可以判斷:

a,都是對同一個例項的synchronized域訪問,因此不能被同時訪問

b,是針對不同例項的,因此可以同時被訪問

c,因為是static synchronized,所以不同例項之間仍然會被限制,相當於Test.A()與Test.B()了,因此不能被同時訪問。

那麼,第d呢?,書上的 答案是可以被同時訪問的,答案理由是synchronzied的是例項方法與synchronzied的類方法由於鎖定(lock)不同的原因.一個是物件鎖,一個是類鎖。