鎖的策略及synchronized詳解

加鎖過程中,處理沖突的過程中,涉及到的一些不同的處理方式。鎖的策略決定了線程如何獲取和釋放鎖以及在何種情況下阻塞和喚醒線程。

1. 常見的鎖策略?

1.1? 樂觀鎖和悲觀鎖

  • 樂觀鎖:在加鎖之前,預估當前出現鎖沖突的概率不大,因此在進行加鎖的時候不會做太多的工作,于是加鎖的速度就可能更快,當更容易引入一些其他的問題,例如肯能會消耗更多的CPU資源。
  • 悲觀鎖:在加鎖之前,預估當前出現鎖沖突的概率比較大,因此在加鎖的時候就會做更多的工作,所以加鎖的速度可能會更慢,但是整個過程中不容易出現其他問題。

1.2?輕量級鎖和重量級鎖

  • 輕量級鎖:加鎖的開銷更小,加鎖速度更快。輕量級鎖一般就是樂觀鎖
  • 重量級鎖:加鎖的開銷更大,加鎖速度更慢。重量級鎖一般也就是悲觀鎖

注意:

  • 輕量級鎖和重量級鎖的定義是加鎖后對結果的評價而來
  • 樂觀鎖和悲觀鎖的定義是對未發生的事做出預估而來?

?1.3?自旋鎖和掛起等待鎖

  • 自旋鎖:自旋鎖就是輕量級鎖的一種典型實現,進行加鎖的時候搭配一個while循環,如果加鎖成功則循環結束,加鎖失敗不進入阻塞而是再次嘗試。這個反復快速執行的過程就稱為“自旋”。一旦其他線程釋放了鎖能第一時間拿到,同時這樣的自旋鎖也是樂觀鎖,使用自旋的前提就是預期沖突概率不大,其他線程釋放了鎖,就能第一時間拿到。如果當前加鎖的線程特別多,使用自旋鎖則會浪費過多的CPU資源。
  • 掛起等待鎖:掛起等待鎖就是悲觀鎖的一種實現,同時也是重量級鎖,加鎖失敗時進入阻塞等待,不會繼續消耗CPU資源,掛起等待的時候需要內核調度器介入,這部分要完成的操作很多,所以真正獲取到鎖的時間會更長,適用于鎖沖突激烈的情況。

1.4 普通互斥鎖和讀寫鎖?

  • 普通互斥鎖:普通互斥鎖也被稱為排它鎖,它確保在任何時刻只有一個線程可以獲得鎖并訪問共享資源。當一個線程持有鎖時,其他線程需要等待鎖的釋放才能繼續執行,類似于synchronized 加鎖解鎖。
  • 讀寫鎖:讀寫鎖把鎖分為兩種情況,加讀鎖和加寫鎖。讀鎖和讀鎖之間,不會出現鎖沖突,即允許多個線程同時讀取共享資源;寫鎖和寫鎖之間會出現鎖沖突;讀鎖和寫鎖之間會出現鎖沖突。

?為什么要引入讀寫鎖?

如果兩個線程讀同一個數據,這個操作本身就是線程安全的,不需要阻塞,如果使用 synchronized 加鎖,則會阻塞,對于性能有一定影響。

1.5 公平鎖和非公平鎖?

  • 公平鎖:公平鎖按照請求鎖的順序分配鎖資源即 “先來后到” ,保證每個線程都有公平的機會獲得鎖。這種策略避免了線程饑餓現象,但會導致額外的開銷,因為線程可能需要等待其他線程釋放鎖。
  • 非公平鎖:不遵守 “先來后到” 的規則,所有線程都有可能獲取到鎖。

1.6 可重入鎖和不可重入鎖?

  • ?可重入鎖:一個線程使用一把鎖連續加鎖兩次,不會產生死鎖,就是可重入鎖,如 synchronized。
  • 不可重入鎖:一個線程使用一把鎖連續加鎖兩次,會產生死鎖,則是不可重入鎖。

?

2. synchronized

2.1?synchronized 的鎖策略

synchronized 具有自適應能力

synchronized 在某些情況下是 樂觀鎖/輕量級鎖/自旋鎖 有些情況下是 悲觀鎖/重量級鎖/掛起等待鎖。

內部會自動評估當前鎖沖突的激烈程度。

  • 如果當前鎖沖突的激烈程度小,就處于 樂觀鎖/輕量級鎖/自旋鎖。
  • 如果當前鎖沖突的激烈程度大,就處于 悲觀鎖/重量級鎖/掛起等待鎖。

2.2 鎖升級

當線程執行到 synchronized 的時候,如果鎖還是空閑的,就會經歷以下過程:

  1. 偏向鎖階段:每個鎖對象中有一個偏向鎖標記,當這個鎖對象首次被加鎖時,會進入偏向鎖,鎖對象會記錄下該線程的id,如果下次加鎖,沒有鎖競爭,并且仍然是同一個線程拿到鎖,這個鎖仍然是偏向鎖。偏向鎖并不會真的加上鎖,由于兩次都是同一個線程來獲取鎖,所以認為沒有鎖競爭,所以就不用真的加上鎖,免去了一定開銷。
    注意:如果一個鎖此前都是線程1的偏向鎖,在某次線程1再次嘗試加鎖時,出現了一個線程2 也嘗試加鎖,此時這個鎖會升級為輕量級鎖,然后再由這兩個線程來競爭。但是本次加鎖一定是線程1拿到鎖,線程2下次競爭才可能拿到鎖。
    ?
  2. 輕量級鎖階段:當偏向鎖出現鎖競爭時,或者本次加鎖的線程與第一次記錄的不同,這個鎖則會升級為輕量級鎖。此處是通過自旋鎖的方式來實現的。
    ?
  3. 重量級鎖階段:當參與鎖競爭的線程達到某個閾值,就會從輕量級鎖升級到重量級鎖。

注意:鎖的升級不可逆。

2.3 鎖消除?

鎖消除也是 synchronized 中內置的優化策略。

?編譯器編譯代碼的時候,如果發現這個代碼不需要加鎖,就會取消掉這個鎖。但是這個優化是比較有限的,如果代碼稍微復雜一些,編譯器是判斷不了是否需要加鎖的。

2.4 鎖粗化?

會把多個加鎖代碼塊合成一個代碼塊,去除了多次加鎖解鎖的開銷。

例如:

synchronized(locker) {a++;
}
synchronized(locker) {b++;
}

可粗化為:

synchronized(locker) {a++;b++;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209638.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209638.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209638.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker三 | 數據卷

目錄 Docker數據卷簡介 添加數據卷的命令 容器數據卷的繼承 Docker數據卷簡介 Docker容器產生的數據,如果不備份,當容器實例刪除后,容器中的數據也會消失,為了保存數據可以在Docker中使用數據卷。Docker數據卷是宿主機的一個可以…

vue3中子組件調用父組件的方法

<script lang"ts" setup>前提 父組件&#xff1a; 子組件&#xff1a; const emit defineEmits([closeson]) 在子組件的方法中使用&#xff1a; emit(closeson)

EP15:動態內存管理概述(c語言)malloc,calloc,realloc函數的介紹使用及柔性數組的介紹

如果學習方向是c方向那么c語言有三個板塊的知識是非常重要的. 1:指針 2:結構體 3;動態內存管理. 序言:在c語言中,什么是動態內存 C語言中的動態內存是指在程序運行時&#xff0c;根據需要動態地分配內存空間的一種內存管理方式。與靜態內存相比&#xff0c;動態內存的大小和生…

12.ROS導航模塊:gmapping、AMCL、map_server、move_base案例

目錄 1 導航概述 2 導航簡介 2.1 導航模塊簡介 1.全局地圖 2.自身定位 3.路徑規劃 4.運動控制 5.環境感知 2.2 導航坐標系odom、map 1.簡介 2.特點 3.坐標系變換 2.3 導航條件說明 1.硬件 2.軟件 3 導航實現 3.1 創建本篇博客的功能包 3.2 建圖--gmapping 3.…

JavaScript基礎知識整理(最全知識點, 精簡版,0基礎版)

文章目錄 一、輸入和輸出內容 1.1 輸出 1.1.1 在瀏覽器的控制臺輸出打印 1.1.2 直接在瀏覽器的頁面上輸出內容 1.1.3 頁面彈出警告對話框 1.2 輸入 二、變量 2.1 變量是什么 2.2 變量的聲明和賦值 2.3 變量的命名規范和規范 三、變量擴展&#xff08;數組&#xff09; 3.1 數組…

Cypress:前端自動化測試的終極利器

引言&#xff1a; 在現代軟件開發中&#xff0c;前端自動化測試已經成為了一個不可或缺的環節。它不僅可以提高開發效率&#xff0c;減少手動測試的工作量&#xff0c;還可以保證軟件的穩定性和質量。而在眾多的前端自動化測試工具中&#xff0c;Cypress無疑是其中的佼佼者。本…

openGauss學習筆記-144 openGauss 數據庫運維-例行維護-慢sql診斷

文章目錄 openGauss學習筆記-144 openGauss 數據庫運維-例行維護-慢sql診斷144.1 背景信息144.2 前提條件 openGauss學習筆記-144 openGauss 數據庫運維-例行維護-慢sql診斷 144.1 背景信息 在SQL語句執行性能不符合預期時&#xff0c;可以查看SQL語句執行信息&#xff0c;便…

文章解讀與仿真程序復現思路——中國電機工程學報EI\CSCD\北大核心《考慮垃圾處理與調峰需求的可持續化城市多能源系統規劃》

這個標題涵蓋了城市多能源系統規劃中的兩個重要方面&#xff1a;垃圾處理和調峰需求&#xff0c;并強調了規劃的可持續性。 考慮垃圾處理&#xff1a; 含義&#xff1a; 垃圾處理指的是城市廢棄物的管理和處置。這可能涉及到廢物分類、回收利用、焚燒或填埋等方法。重要性&…

GIS入門,Leaflet介紹,Leaflet可以做什么,網頁中如何使用Leaflet地圖,vue中如何使用Leaflet地圖

VueLeafLet教程推薦&#xff1a;《VueLeaflet入門》 Leaflet介紹 Leaflet是一個開源的JavaScript庫&#xff0c;用于創建交互式的地圖和地圖應用。Leaflet框架具有輕量級、靈活性強、易于使用和擴展等特點&#xff0c;支持各種地圖服務商&#xff08;如OpenStreetMap、Google…

前端知識筆記(三十八)———HTTPS:保護網絡通信安全的關鍵

當談到網絡通信和數據傳輸時&#xff0c;安全性是一個至關重要的問題。在互聯網上&#xff0c;有許多敏感信息需要通過網絡進行傳輸&#xff0c;例如個人身份信息、銀行賬戶信息和商業機密等。為了保護這些信息不被未經授權的人訪問和篡改&#xff0c;HTTPS&#xff08;超文本傳…

【開源】基于Vue+SpringBoot的河南軟件客服系統

文末獲取源碼&#xff0c;項目編號&#xff1a; S 067 。 \color{red}{文末獲取源碼&#xff0c;項目編號&#xff1a;S067。} 文末獲取源碼&#xff0c;項目編號&#xff1a;S067。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 系統管理人員2.2 業務操作人員 三、…

搞懂內存函數

引言 本文介紹memcpy的使用和模擬實現、memmove的使用和模擬實現、memcmp使用、memset使用 ? 豬巴戒&#xff1a;個人主頁? 所屬專欄&#xff1a;《C語言進階》 &#x1f388;跟著豬巴戒&#xff0c;一起學習C語言&#x1f388; 目錄 引言 memcpy memcpy的使用 memcpy的…

JS加密/解密之HOOK實戰2

上一篇文章介紹了HOOK常規的應用場景&#xff0c;這篇我們講一下HOOK其他原生函數。又是一個新的其他思路 很多時候&#xff0c;當我們想要某些網站的請求參數的時候&#xff0c;因為某些加密導致了獲取起來很復雜。 這時候hook就十分方便了 源代碼 var _JSON_Parse JSON.…

scp 指令詳細介紹

目錄 1. 基本語法 2. 例子 從本地到遠程 從遠程到本地 從遠程到遠程 使用端口和指定私鑰 遞歸復制目錄 3. 注意事項 如何拷貝文件的軟鏈接 SCP&#xff08;Secure Copy Protocol&#xff09;是一種用于在計算機之間安全地傳輸文件的協議。它通過加密的方式在網絡上安全…

Vue:Vue的開發者工具不顯示Vue實例中的data數據

一、情況描述 代碼&#xff1a; 頁面&#xff1a; 可以看到&#xff0c;input獲取到了data數據&#xff0c;但是&#xff0c;vue-devtool沒有獲取到data數據 二、解決辦法 解決辦法1&#xff1a; data.name的值不能全是中文&#xff0c;比如改成aa尚硅谷 解決辦法2&…

C語言 編程題

C語言學習&#xff01; 1.小明上課需要走n階臺階&#xff0c;他每次可以選擇走一階或者走兩階&#xff0c;他一共有多少種走法&#xff1f; 輸入描述&#xff1a;輸入包含一個整數n&#xff08;1 ≤ n ≤30&#xff09; 輸出描述&#xff1a;輸出一個整數&#xff0c;即小明可…

LeetCode 1457. 二叉樹中的偽回文路徑||位運算 DFS

1457. 二叉樹中的偽回文路徑 給你一棵二叉樹&#xff0c;每個節點的值為 1 到 9 。我們稱二叉樹中的一條路徑是 「偽回文」的&#xff0c;當它滿足&#xff1a;路徑經過的所有節點值的排列中&#xff0c;存在一個回文序列。 請你返回從根到葉子節點的所有路徑中 偽回文 路徑的…

Golang優雅實現按比例切分流量

我們在進行灰度發布時&#xff0c;往往需要轉發一部分流量到新上線的服務上&#xff0c;進行小規模的驗證&#xff0c;隨著功能的不斷完善&#xff0c;我們也會逐漸增加轉發的流量&#xff0c;這就需要按比例去切分流量&#xff0c;那么如何實現流量切分呢&#xff1f; 我們很容…

力扣(LeetCode)-1. 兩數之和

給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元素在答案里不能重復出現。 你可以按任意順序返回…

【交流】PHP生成唯一邀請碼

目錄 前言&#xff1a; 1.隨機生成&#xff0c;核對user表是否已存在 代碼&#xff1a; 解析&#xff1a; 缺點&#xff1a; 2.建表建庫&#xff0c;每次從表中隨機抽取一條&#xff0c;用完時擴充 表結構 表視圖 代碼 解析 缺點 結論&#xff1a; 前言&#xff1a; …