Synchronized保證線程安全的原理

一:通過鎖的角度進行解釋

內置鎖: 萬物皆對象,Java中每一個對象都可以用作同步的鎖,那麼,這些鎖就被稱之爲內置鎖。
它修飾普通方法的時候,內置鎖就是當前類的實例;它修飾靜態方法,內置鎖是當前的Class字節碼對象
在這裏插入圖片描述
synchronized的原理其實就是加了鎖,由內置鎖和互斥鎖所決定的。每個synchronized對象都有鎖,而這些鎖都是互斥的,一個進來之後,另外的就不能進來了,因此就可以保證線程的安全性。

二:通過內存模型角度進行解釋

Java內存模型規定了所有的變量都存儲在主內存中(此處的主內存跟物理硬件的主內存只是名字相同,此處僅僅是指虛擬機內存的一部分),而每條線程還會有自己的工作內存(可以類比cpu的寄存器和高速緩存),線程的工作內存中保存了該線程使用到的變量的主內存的副本拷貝線程對變量的所有操作都必須在工作內存中繼續,而不能直接讀寫主內存中的變量不同線程之間也無法直接訪問對方工作內存中的變量,線程之間變量值的傳遞都需要通過主內存完成,三者關係如下圖:
在這裏插入圖片描述
當我們使用synchronized進行同步的時候,真正被同步的是在工作線程中的數據,簡單的說就是在同步塊或同步方法執行完後,對被鎖定的對象做的任何修改要在釋放鎖之前寫回到主內存中;在進入同步塊得到鎖之後,被鎖定對象的數據是從主內存中讀出來的,持有鎖的線程的工作內存中的數據副本一定和主內存中的數據視圖是同步的

參考鏈接:
https://blog.csdn.net/g_66_hero/article/details/85685646
https://blog.csdn.net/u010653908/article/details/53420004

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