作為Java程序猿synchronized關鍵字你真的理解嗎?

synchronized 修飾 非靜態方法

當修飾非靜態方式時候,我們知道非靜態方式,是屬於對象的,那麼鎖住了對象,意味這個,這個對象在併發情況下,只能執行一個.

但是: 如果是多個對象的情況下,並不能有同步的作用

synchronized(this){

...

}

  • 理解:

所以當用synchronized修飾的時候,是在當前對象上加鎖,僅會在當該對象要併發時候,會進行同步.對併發產生多個該對象並不同步

  • 從性能優化方面講:

我們在用synchronized關鍵字的時候,能縮小代碼段的範圍就儘量縮小,能在代碼段上加同步就不要再整個方法上加同步。這叫減小鎖的粒度,使代碼更大程度的併發

作為Java程序猿synchronized關鍵字你真的理解嗎?

synchronized 修飾靜態代碼的時候類似於下下面

synchronized(當前對象.class){

...

}

當修飾靜態方式時候,我們知道靜態方法是屬於字節碼,不屬於對象,所以根據此思路就明白,所以這個就是同步的代碼塊.

作為Java程序猿synchronized關鍵字你真的理解嗎?

作為Java程序猿synchronized關鍵字你真的理解嗎?

測試過程:

作為Java程序猿synchronized關鍵字你真的理解嗎?

測試結果:

-------------測試同步對象方式:1-------------

測試同步對象方式1開始...

測試同步對象方式1開始...

測試同步對象方式1開始...

測試同步對象方式1結束...

測試同步對象方式1結束...

測試同步對象方式1結束...

-------------測試同步對象方式:2-------------

測試同步對象方式2開始...

測試同步對象方式2開始...

測試同步對象方式2開始...

測試同步對象方式2結束...

測試同步對象方式2結束...

測試同步對象方式2結束...

-------------測試同步代碼塊方式:1-------------

測試同步代碼塊方式1開始...

測試同步代碼塊方式1結束...

測試同步代碼塊方式1開始...

測試同步代碼塊方式1結束...

測試同步代碼塊方式1開始...

測試同步代碼塊方式1結束...

-------------測試同步代碼塊方式:2-------------

測試同步代碼塊方式2開始...

測試同步代碼塊方式2結束...

測試同步代碼塊方式2開始...

測試同步代碼塊方式2結束...

測試同步代碼塊方式2開始...

測試同步代碼塊方式2結束...


分享到:


相關文章: