JAVA——synchronized方法與synchronized代碼塊的區別

區別:

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章