先看一段代碼
Class A { public synchronized methodA() {//對當前對象加鎖 } public methodB() { synchronized(this){}//對當前對象加鎖,與methodA用法相同 } public static synchronized methodC() {}//對類加鎖,即對所有此類的對象加鎖 public methodD(){ synchronized(A.class){}//對類加鎖,即對所有此類的對象加鎖 } }
synchronize用法關鍵是搞清楚對誰加鎖,methodA,和methodB都是對當前對象加鎖,即如果有兩個線程同時訪問同一個對象的methoA和methodB則會發生競爭,必須等待其中一個執行完成后另一個才會執行。如果兩個線程訪問的是不同對象的methodA和methodB則不會競爭。
methodC和methodD是對類的class對象加鎖,methodC和methodD的加鎖對象一樣,效果也一樣。如果兩個線程同時訪問同一個對象的methodC和methodD是會發生競爭的,兩個線程同時訪問不同對象的methodC和methodD是也是會發生競爭的,如果兩個線程同時訪問methoA/B 和methodC/D則不會發生競爭,因為鎖對象不同。