JAVA中synchronized與static synchronized 的區別

JAVA中synchronized與static synchronized 的區別

IT IT哈哈 java

1.synchronized與static synchronized 的區別

synchronized是對類的當前實例進行加鎖,防止其餘線程同時訪問該類的該實例的全部synchronized塊,注意這裏是「類的當前實例」, 類的兩個不一樣實例就沒有這種約束了。那麼static synchronized剛好就是要控制類的全部實例的訪問了,static synchronized是限制線程同時訪問jvm中該類的全部實例同時訪問對應的代碼快。實際上,在類中某方法或某代碼塊中有 synchronized,那麼在生成一個該類實例後,改類也就有一個監視快,放置線程併發訪問改實例synchronized保護快,而static synchronized則是全部該類的實例公用一個監視快了,也也就是兩個的區別了,也就是synchronized至關於 this.synchronized,而static synchronized至關於Something.synchronized.
     一個日本做者-結成浩的《java多線程設計模式》有這樣的一個列子:
pulbic class Something(){ 
    publicsynchronizedvoid isSyncA(){} 
    publicsynchronizedvoid isSyncB(){} 
    publicstaticsynchronizedvoid cSyncA(){} 
    publicstaticsynchronizedvoid cSyncB(){} 
}
那麼,加入有Something類的兩個實例a與b,那麼下列組方法何以被1個以上線程同時訪問呢
a. x.isSyncA()與x.isSyncB()  
b. x.isSyncA()與y.isSyncA() 
c. x.cSyncA()與y.cSyncB() 
d. x.isSyncA()與Something.cSyncA()

這裏,很清楚的能夠判斷:
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代碼快的區別

synchronized methods(){} 與synchronized(this){}之間沒有什麼區別,只是synchronized methods(){} 便於閱讀理解,而synchronized(this){}能夠更精確的控制衝突限制訪問區域,有時候表現更高效率。

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

這個在《搞懂java中的synchronized關鍵字》一文中看到的,我想這一點也是很值得注意的,繼承時子類的覆蓋方法必須顯示定義成synchronized。(可是若是使用繼承開發環境的話,會默認加上synchronized關鍵字)
相關文章
相關標籤/搜索