Synchronizeed的底層實現

2021-10-08 17:42:33 字數 1072 閱讀 7055

同步方法

acc_synchronized識別符號

jvm根據以上識別符號去判斷該方法是否為同步方法,如果是,執行的執行緒會獲取monitor lock,獲取執行方法體,在方法體執行完之後釋放monitor,方法執行期間,其他任何執行緒都沒有辦法去獲得當前的monitor物件,只能阻塞

同步**塊

每乙個物件都與乙個monitor相關聯,乙個monitor lock只能被乙個執行緒在同一時間鎖獲得

(1) 如果monitor計數器為0,表示當前monitor lock未被獲取,該執行緒獲得之後就會對該計數器+1->monitorenter

(2) 如果monitor已經被執行緒所擁有,則其他執行緒嘗試獲取monitor lock,會被陷入阻塞狀態,直到monitor計數器為0,才能夠再次去獲取monitor lock->monitor exit

syncronized鎖公升級分析

(1)偏向鎖

(原子性) cas操作,cpu層面的原子性操作指令,該指令存在三個引數,第一引數是目標的值,第二引數是值1,第三引數是值2,指令會比較目標儲存的值跟值1是否一致,如果一致目標位址會更新為值2。如果乙個執行緒獲得了鎖,那麼鎖就會進入偏向模式,鎖標識位為01,是否為偏向鎖為1,當這次執行緒再次請求鎖的時候,不需要做同步操作,直接省略鎖的獲取階段提高效能(不存在鎖的競爭)

(2)輕量級鎖

執行緒交替執行同步**塊的場合

在**進入同步**塊的時候,如果物件是無鎖狀態,在當前執行緒的棧幀中建立乙個lock record空間儲存物件mark word的拷貝,jvm使用cas操作將物件的mark word更新為指向lock record的乙個引用,如果成功則該執行緒擁有這樣物件鎖,物件mark word的鎖標誌設定為00,表明該物件處於輕量級鎖的狀態,如果失敗,則競爭更加激烈,會公升級為重量級鎖*(輕量級鎖搶鎖失敗,jvm會使用自旋鎖,不斷嘗試取鎖)

(3)重量級鎖

重量級鎖會有作業系統的互斥量,(mvtex)和條件變數(condition variable)與其相關聯,在獲取鎖的過程修改作業系統層面的兩個變數

使用者態<----->核心態

MATLAB實現車牌識別 藍色底 黃色底

matlab實現簡單的車牌識別 很多數學建模或者一些畢業 都會涉及到車牌識別,這裡採用matlab語言進行編寫,較為詳盡的介紹了車牌識別的兩種常用方法 方法 一 簡單定位法 這是自己取的名字,這是對於車牌所處環境顏色不複雜時採用的方法 進行灰度處理 進行影象邊緣檢測和腐蝕,膨脹和平滑影象輪廓,最後去...

底半部機制

1 tasklet 只需要定義三段 功能函式 void my tasklet unsigned long data 定義cdd tasklet 變數,繫結my tasklet函式 declare tasklet cdd tasklet,my tasklet,0 tasklet schedule cd...

蘇格拉底的婚姻

有一天,柏拉圖問老師蘇格拉底到底什麼是愛情?老師就讓他先到到麥田裡去,摘一棵全麥田裡最大最金黃的麥穗來,期間只能摘一次,並且只可向前走,不能回頭。柏拉圖於是按照老師說的去做了。結果他兩手空空的走出了田地。老師問他為什麼摘不到?他說 因為只能摘一次,又不能走回頭路,期間即使見到最大最金黃的,因為不知前...