1. 程式人生 > >synchronized與static synchronized詳解

synchronized與static synchronized詳解

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

的不同synchronized域訪問。

B: 可以被同時訪問,原因:是對不同例項xy的相同synchronized域訪問。

C: 不能被同時訪問,原因:是對不同例項xy的不同static synchronized域訪問。

D: 可以被同時訪問,原因:是對例項xsynchronized域和類Somethingstatic synchronized域同時訪問。

總結

  • synchronized鎖的是例項物件,static synchronized鎖的是類物件
  • 若例項被鎖,則該例項所有同步方法全部被鎖
  • 若類被鎖,則該類所有同步方法全部被鎖

例項鎖與類鎖之間互不干擾