區別:
1.當A線程訪問對象的synchronized(this)代碼塊的時候,B線程依然可以訪問對象方法中其餘非synchronized塊的部分。
注:該情況在該方法沒有加synchronized修飾的情況下成立。因爲synchronized代碼塊和synchronized方法其實共享一把鎖,鎖住的同樣是整個對象。
2.同步方法直接在方法上加synchronized實現加鎖,同步代碼塊則在方法內部加鎖,很明顯,同步方法鎖的範圍比較大,而同步代碼塊範圍要小點,一般同步的範圍越大,性能就越差,一般需要加鎖進行同步的時候,肯定是範圍越小越好,這樣性能更好。所以我們對會引起線程安全問題的那部分代碼進行synchronized就可以了。
3.synchronized方法便於閱讀理解,而synchronized代碼塊可以更精確的控制衝突限制訪問區域,有時候表現得更加高效。
synchronized(非this對象)
JAVA還支持對"任意對象"作爲對象監視器來實現同步的功能。這個"任意對象"大多數是實例變量及方法的參數,使用格式爲synchronized(非this對象)。
其實同理,鎖住的不是當前實例對象,而是放入synchronized(非this對象)中的非this對象,即對該對象進行加鎖。
優點:
如果在一個類中有很多synchronized方法,這時雖然能實現同步,但會受到阻塞,從而影響效率。
但如果同步代碼塊鎖的是非this對象,則synchronized(非this對象)代碼塊中的程序與同步方法是異步的,不與其他鎖this同步方法爭搶this鎖,大大提高了運行效率。
注:synchronized(非this對象),這個對象如果是實例變量的話,指的是對象的引用,只要對象的引用不變,即使改變了對象的屬性,運行結果依然是同步的。
參考博客:https://www.jianshu.com/p/8327c5c15cb8