首頁  >  文章  >  Java  >  synchronized與static synchronized 的區別

synchronized與static synchronized 的區別

高洛峰
高洛峰原創
2016-12-13 11:18:171264瀏覽

 1.synchronized與static synchronized 的區別
      synchronized是對類的當前實例進行加鎖,防止其他線程同時訪問該類的該實例的所有synchronized塊,這裡是“類的當前實例”, 類的當前實例不同實例就沒有這種約束了。那麼static synchronized恰好就是要控制類別的所有實例的存取了,static synchronized是限制執行緒同時存取jvm中該類別的所有實例同時存取對應的程式碼快。實際上,在類別中某方法或某程式碼區塊中有synchronized,那麼在產生一個該類別實例後,改類別也就有一個監視快,放置執行緒並發存取改實例synchronized保護快,而static synchronized則是所有此類的實例公用一個監視快了,也也就是兩個的區別了,也就是synchronized相當於this.synchronized,而
static synchronized相當於Something.synchronized.
     執行長
         public static synchronized void cSyncA(){}
         public static synchronized void cSyncB(){}
     }
   那麼,加入兩個有Something類別的實例a與b,下列群組方法何以被1個以上執行緒同時存取呢
   a.   x.isSync()與x.isA()與x.is b.   x.isSyncA()與y.isSyncA()
   c.   x.cSyncA()與y.cSyncB()
   d.   x.isSyncA()與Something.cSyn  d.   x.
   a,都是對同一個實例的synchronized域訪問,因此不能被同時訪問
   b,是針對不同實例的,因此可以同時被訪問
   c,因為是static synchronized,所以不同實例之間仍然會被限制,相當於Something.isSyncA()與   Something.isSyncB()了,因此不能被同時訪問。
   那麼,第d呢?,書上的 答案是可以被同時訪問的,答案理由是synchronzied的是實例方法與synchronzied的類方法由於鎖定(lock)不同的原因。
   個人分析也就是synchronized 與static synchronized 相當於兩幫派,各自管各自,相互之間就無約束了,可以被同時訪問。目前還不是分清楚java內部設計synchronzied是怎麼樣實現的。


    結論:A: synchronized static是某個類別的範圍,synchronized static cSync{}防止多個執行緒同時存取這個    類別中的synchronized static 方法。它可以對類別的所有物件實例起作用。
   
               B: synchronized 是某實例的範圍,synchronized isSync(){}防止多個執行緒同時存取此實例中的synchronized 方法。



     2.synchronized方法與synchronized代碼快的區別
     2.synchronized方法與synchronized代碼快的區別

      synchronized methods(){} 與synchronized(this) synchronized methods(){} 與synchronized(this) ed(this) {}可以更精確的控制衝突限制存取區域,有時表現更高效率。



     3.synchronized關鍵字是不能繼承的


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn