synchronized修飾方法和代碼塊的區別


先看一段代碼

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則不會發生競爭,因為鎖對象不同。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM