synchronized與static synchronized詳解
阿新 • • 發佈:2018-12-18
synchronized與static synchronized的區別
-
synchronized是例項鎖,對類的當前例項進行加鎖,防止其他執行緒同時訪問該例項的所有synchronized塊。
注意這裡是類的當前例項, 類的兩個不同例項就沒有這種約束了
-
static synchronized是類鎖,控制類的所有例項的併發訪問,限制多執行緒中該類的所有例項同時訪問JVM中該類所對應的程式碼塊。
例題講解
假如有Something類的兩個例項x與y,那麼下列各組方法被多執行緒同時訪問的情況是怎樣的?
pulbic class Something{
public synchronized void isSyncA(){}
public synchronized void isSyncB(){}
public static synchronized void cSyncA(){}
public static synchronized void cSyncB(){}
}
A. x.isSyncA() 與 x.isSyncB()
B. x.isSyncA() 與 y.isSyncA()
C. x.cSyncA() 與 y.cSyncB()
D. x.isSyncA() 與 Something.cSyncA()
A: 不能被同時訪問,原因:是對相同例項x
B: 可以被同時訪問,原因:是對不同例項x和y的相同synchronized域訪問。
C: 不能被同時訪問,原因:是對不同例項x和y的不同static synchronized域訪問。
D: 可以被同時訪問,原因:是對例項x的synchronized域和類Something的static synchronized域同時訪問。
總結
- synchronized鎖的是例項物件,static synchronized鎖的是類物件
- 若例項被鎖,則該例項的所有同步方法全部被鎖
- 若類被鎖,則該類的所有同步方法全部被鎖
例項鎖與類鎖之間互不干擾