摘要:各種鎖公平鎖和非公平鎖公平鎖每個線程按照調用的順序依次獲取鎖獲取鎖之前先檢查等待隊列是否有線程如果沒有線程嘗試獲取鎖否則排隊非公平鎖線程獲取鎖的順序不定與調用順序無關直接嘗試獲取鎖未成功再排隊例子線程到達順序先到達獲取鎖到達獲取鎖嘗試獲
各種鎖 公平鎖和非公平鎖 公平鎖
每個線程按照調用lock的順序依次獲取鎖, 獲取鎖之前先檢查等待隊列是否有線程, 如果沒有線程嘗試獲取鎖, 否則排隊
非公平鎖線程獲取鎖的順序不定, 與調用lock順序無關, 直接嘗試獲取鎖, 未成功再排隊
例子線程到達順序 A->B->C
A先到達獲取鎖
B到達獲取鎖, 嘗試獲取失敗, 進入排隊隊列
A釋放鎖喚醒B, 同時C到達
公平鎖
C發現等待隊列中有線程, 直接進入等待隊列隊尾排隊掛起, B獲取到鎖
非公平鎖
情況一: C一來直接嘗試獲取鎖, B獲取鎖失敗, 再次進入等待隊列掛起
情況二: C一來直接嘗試獲取鎖, B獲取鎖成功, C進入等待隊列掛起
悲觀鎖和樂觀鎖 悲觀鎖每次獲取數據之前先加鎖, 結束之后再釋放, 占據鎖期間, 別人無法獲取數據
樂觀鎖獲取數據時不加鎖, 但是設定一個版本號, 執行完事務后, 與最初版本號進行比較, 如果相等說明數據沒有被修改, 將版本號加一, 如果獲取到的版本號小于最新版本號, 說明當前數據可能被修改過, 放棄本次操作, 重新操作
適用場景當沖突較少發生時, 可以選擇使用樂觀鎖, 節省了加鎖的代價, 加大吞吐量; 但當沖突較多發生時, 選擇樂觀鎖時則會經常Retry, 降低性能, 或者此時可以選用悲觀鎖
mysql實現 悲觀鎖實現select from ... for update樂觀鎖實現
在表中增加一個作為數據版本號的字段, 最好為每個需要樂觀鎖的字段多帶帶設置一個版本號, 否則可能會造成不必的沖突
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70941.html
摘要:只有首先獲得鎖的任務線程才能繼續獲取該對象上的多個鎖。會進一步對時失敗的那些線程進行阻塞操作調用操作系統的信號量此段來摘自別處。提供了多樣化的同步,比如有時間限制的同步,可以被的同步的同步是不能的等。 各種方法 1?synchronized方法。 public synchronized void save(){} 2?synchronized代碼塊。 synchronized(obj...
摘要:導讀閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己進行查漏補缺,覺得本文對你有幫助的話,可以點贊關注一下。目錄一基礎篇二進階篇三高級篇四架構篇五擴 導讀:閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己...
閱讀 2526·2021-11-15 11:38
閱讀 2890·2021-11-02 14:44
閱讀 3827·2021-09-26 10:13
閱讀 3065·2021-08-13 15:02
閱讀 783·2019-08-30 15:56
閱讀 1460·2019-08-30 15:53
閱讀 2365·2019-08-30 13:01
閱讀 3239·2019-08-29 12:57