鎖的底層原理

2021-10-25 17:27:27 字數 1054 閱讀 8886

那麼golang中加鎖加了什麼?

1、禁止編譯器做優化(優化遮蔽);

2、禁止cpu進行指令重排(記憶體遮蔽)

3、針對快取行和記憶體匯流排的控制;

4、衝突時的任務等待佇列。

常見鎖總結:

自旋鎖:只要沒有鎖上,就不斷重試。

如果別的執行緒長期持有該鎖,那麼你這個執行緒就一直在 while while while 地檢查是否能夠加鎖,浪費 cpu 做無用功。

優點:不切換上下文;

不足:燒cpu;

適用場景:衝突不多,等待時間不長的情況下,或者少次數的嘗試自旋.

互斥鎖:

作業系統負責執行緒排程,為了實現「鎖的狀態發生改變時再喚醒」就需要把鎖也交給作業系統管理。

所以互斥器的加鎖操作通常都需要涉及到上下文切換,操作花銷也就會比自旋鎖要大。

優點:簡單高效;

不足:衝突等待時的上下文切換;

適用場景:絕大部分情況下都可以直接使用互斥鎖

條件鎖:

它解決的問題不是「互斥」,而是「等待」。

訊息佇列的消費者程式,在隊列為空的時候休息,資料不為空的時候(條件改變)啟動消費任務。

條件鎖的業務針對性更強。

互斥鎖操作:

大概的原始碼處理邏輯如下:

1 通過cas操作來競爭鎖的狀態 &m.state;

2 沒有競爭到鎖,先主動自旋嘗試獲取鎖 runtime_canspin 和 runtime_dospin (原地燒cpu);

3 自旋嘗試失敗,再次cas嘗試獲取鎖;

4 runtime_semacquiremutex 鎖請求失敗,進入休眠狀態,等待訊號喚醒後重新開始迴圈;

5 m.state等待佇列長度(復用的int32位數字,第一位是鎖的狀態,後31位是鎖的等待佇列長度計數器);

Synchronized的底層原理和鎖的公升級

syncrhonized的作用方式 同步方法 鎖是當前例項物件 靜態同步方法 鎖是類物件 同步 塊 鎖是括號中的物件 實現同步的底層原理 jvm基於進入和退出monitor物件來實現同步方法和同步 塊。同步方法經過編譯後,會在常量池生成acc synchronized的識別符號,通過給同步方法新增a...

redis深度理解底層鎖原理

redis的鎖分別有incr setnx set,那麼我們就開始來談談他們的用法和場景吧!1.incr 計時器,1操作 a 語法 incr key b 場景 1 控制api 1秒內的多次訪問 2 記錄使用者每天訪問 的登入次數 c 為何我們說這個怎麼能算鎖呢,當然,單獨它肯定是算不了鎖的,因為它本身...

synchronized底層實現原理及鎖優化

一 概述 1 synchronized作用 原子性 synchronized保證語句塊內操作是原子的 可見性 synchronized保證可見性 通過 在執行unlock之前,必須先把此變數同步回主記憶體 實現 有序性 synchronized保證有序性 通過 乙個變數在同一時刻只允許一條執行緒對其...