咕泡學習筆記(1)深入理解synchronized

2021-09-23 17:14:53 字數 1734 閱讀 4759

synchronized關鍵字是jvm中悲觀鎖的一種實現方式,1.6之後做了一些優化,並不是簡單的悲觀鎖了,涉及到偏向鎖、輕量級鎖、重量級鎖的轉化,使用的理解其實很簡單,就是傳入要鎖的物件,鎖定的**塊要想執行,一定要去獲取這個物件鎖才行。鎖的使用一定有資源的共享和互斥的關係,最簡單的例子:多執行緒去遞增乙個數,這個數是執行緒共享的,而增加的操作應該是互斥的。

每個物件都儲存了自己的鎖資訊,總體來說物件鎖儲存在物件頭裡面。在hotspot虛擬機器中,物件在記憶體中儲存的布局可以分為3塊區域:物件頭(header)、例項資料(instance data)和對齊填充(padding)。

包括兩部分資訊,第一部分用於儲存物件自身的執行時資料,如雜湊碼(hashcode)、gc分代年齡、鎖狀態標誌、執行緒持有的鎖、偏向執行緒id、偏向時間戳等。

mark word 記錄了物件和鎖有關的資訊,當某個物件被synchronized 關鍵字當成同步鎖時,那麼圍繞這個鎖的一系列操作都和 mark word 有關係。mark word 可能變化為儲存以下 5 中情況。

類元資訊,即物件指向它的類元資料的指標,虛擬機器通過這個指標來確定這個物件是哪個類的例項。

對齊填充並不是必然存在的,也沒有特別的含義,它僅僅起著佔位符的作用。由於hotspot vm的自動記憶體管理系統要求對物件的大小必須是8位元組的整數倍。當物件其他資料部分沒有對齊時,就需要通過對齊填充來補全。

大部分情況下,鎖不僅僅不存在多執行緒競爭,而是總是由同乙個執行緒多次獲得,為了讓執行緒獲取鎖的代價更低就引入了偏向鎖的概念。怎麼理解偏向鎖呢?當乙個執行緒訪問加了同步鎖的**塊時,會在物件頭中儲存當前執行緒的id,後續這個執行緒進入和退出這段加了同步鎖的**塊時,不需要再次加鎖和釋放鎖。而是直接比較物件頭裡面是否儲存了指向當前執行緒的偏向鎖。如果相等表示偏向鎖是偏向於當前執行緒的,就不需要再嘗試獲得鎖了

首先獲取鎖物件的markword,判斷是否處於可偏向狀態。(biased_lock=1、且threadid為空)

如果是可偏向狀態,則通過cas操作,把當前執行緒的id寫入到markworda)如果cas成功,那麼markword就會變成這樣。表示已經獲得了鎖物件的偏向鎖,接著執行同步**塊b)如果cas失敗,說明有其他執行緒已經獲得了偏向鎖,這種情況說明當前鎖存在競爭,需要撤銷已獲得偏向鎖的執行緒,並且把它持有的鎖公升級為輕量級鎖(這個操作需要等到全域性安全點,也就是沒有執行緒在執行位元組碼)才能執行

如果是已偏向狀態,需要檢查markword中儲存的threadid是否等於當前執行緒的threadid 

a)如果相等,不需要再次獲得鎖,可直接執行同步**塊   

b)如果不相等,說明當前鎖偏向於其他執行緒,需要撤銷偏向鎖並公升級到輕量級鎖

原獲得偏向鎖的執行緒如果已經退出了臨界區,也就是同步**塊執行完了,那麼這個時候會把物件頭設定成無鎖狀態並且爭搶鎖的執行緒可以基於cas重新偏向但前線程

如果原獲得偏向鎖的執行緒的同步**塊還沒執行完,處於臨界區之內,這個時候會把原獲得偏向鎖的執行緒公升級為輕量級鎖後繼續執行同步**塊在我們的應用開發中,絕大部分情況下一定會存在2個以上的執行緒競爭,那麼如果開啟偏向鎖,反而會提公升獲取鎖的資源消耗。所以可以通過jvm引數usebiasedlocking來設定開啟或關閉偏向鎖

深入理解 sync修飾符

乙個元件上只能定義乙個v model,如果其他prop也要實現雙向繫結的效果該怎麼辦呢?簡單的方法是子元件向父元件傳送乙個事件,父元件監聽該事件,然後更新prop。具體如下 info.vue元件定義了乙個value 屬性,和乙個valuechanged事件 父元件index.vue myvalue ...

深入理解vue 修飾符sync

示例 如下 bar comp 會被擴充套件為 bar update foo val bar val comp 當子元件需要更新 foo 的值時,它需要顯式地觸發乙個更新事件 this emit update foo newvalue 猛一看不明白,下邊通過乙個例項 彈窗的關閉事件 來說明這個 到底是...

深入理解javascript 基礎筆記1

通過var宣告 或未宣告的變數都會在全域性window,this上產生全域性變數。對於 var a b 0 來說,全域性變數a是不能被刪除的,隱式全域性變數b是可以刪除的 對於乙個系統的不同組成部分,如果都有相同命名的全域性變數名,如parta,partb都有乙個全域性變數result,後者會替換前...