synchronized與static synchronized 的區別
synchronized是對類的當前實例進行加鎖防止其他線程同時訪問該類的該實例的所有synchronized塊注意這裡是類的當前實例類的兩個不同實例就沒有這種約束了那麼static synchronized恰好就是要控制類的所有實例的訪問了static synchronized是限制線程同時訪問jvm中該類的所有實例同時訪問對應的代碼快實際上在類中某方法或某代碼塊中有synchronized那麼在生成一個該類實例後該類也就有一個監視快放置線程並發訪問改實例synchronized保護快而static synchronized則是所有該類的實例公用一個監視快了也就是兩個的區別了也就是synchronized相當於thissynchronized而
static synchronized相當於Somethingsynchronized
一個日本作者結成浩的《java多線程設計模式》有這樣的一個列子
pulbic class Something(){
public synchronized void isSyncA(){}
public synchronized void isSyncB(){}
public static synchronized void cSyncA(){}
public static synchronized void cSyncB(){}
}
那麼加入有Something類的兩個實例a與b那麼下列組方法何以被個以上線程同時訪問呢
a xisSyncA()與xisSyncB()
b xisSyncA()與yisSyncA()
c xcSyncA()與ycSyncB()
d xisSyncA()與SomethingcSyncA()
這裡很清楚的可以判斷
a都是對同一個實例的synchronized域訪問因此不能被同時訪問
b是針對不同實例的因此可以同時被訪問
c因為是static synchronized所以不同實例之間仍然會被限制相當於SomethingisSyncA()與 SomethingisSyncB()了因此不能被同時訪問
那麼第d呢?書上的 答案是可以被同時訪問的答案理由是synchronzied的是實例方法與synchronzied的類方法由於鎖定(lock)不同的原因
個人分析也就是synchronized 與static synchronized 相當於兩幫派各自管各自相互之間就無約束了可以被同時訪問目前還不是分清楚java內部設計synchronzied是怎麼樣實現的
結論A: synchronized static是某個類的范圍synchronized static cSync{}防止多個線程同時訪問這個 類中的synchronized static 方法它可以對類的所有對象實例起作用
B: synchronized 是某實例的范圍synchronized isSync(){}防止多個線程同時訪問這個實例中的synchronized 方法
synchronized方法與synchronized代碼快的區別
synchronized methods(){} 與synchronized(this){}之間沒有什麼區別只是 synchronized methods(){} 便於閱讀理解而synchronized(this){}可以更精確的控制沖突限制訪問區域有時候表現更高效率
synchronized關鍵字是不能繼承的
這個在一文中看到的我想這一點也是很值得注意的繼承時子類的覆蓋方法必須顯示定義成synchronized
注synchronized 區塊可以鎖定指定的對象
synchronized 方法只能鎖定現階段的對象
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27496.html