基本鎖介紹

1、分類

樂觀鎖:在select的時候不會加鎖,是基于程序實現的,所以不會存在死鎖的情況。適用于讀多寫少的場景(寫的并發量相對不高),可以提高系統的吞吐量。因為如果寫多的話,樂觀鎖會有很大機率更新失敗,需要不斷的自旋執行查找和更新操作。自旋的時候會一直占用CPU,會耗費大量的CPU資源。悲觀鎖:在select的時候就會加鎖,采用先加鎖后處理的模式,雖然保證了數據處理的安全性,但也會阻塞其他線程的寫操作。悲觀鎖適用于寫多讀少的場景,因為拿不到鎖的線程,會將線程掛起,交出CPU資源,可以把CPU給其他線程使用,提高了CPU的利用率。鎖分類:悲觀鎖:具有強烈的獨占和排他特性,在整個數據處理過程中,將數據處于鎖定狀態。適合于寫比較多,會阻塞讀操作。樂觀鎖:采取了更加寬松的加鎖機制,大多是基于數據版本( Version )及時間戳來實現。。適合于讀比較多,不會阻塞讀獨占鎖:互斥鎖、排他鎖:保證在任一時刻,只能被一個線程獨占排他持有。synchronized、ReentrantLock
共享鎖:可同時被多個線程共享持有。CountDownLatch到計數器、Semaphore信號量 可重入鎖:又名遞歸鎖。同一個線程在外層方法獲取鎖的時候,在進入內層方法時會自動獲取鎖。
不可重入鎖:公平鎖: 有優先級的鎖,先來先得,誰先申請鎖就先獲取到鎖
非公平鎖: 無優先級的鎖,后來者也有機會先獲取到鎖自旋鎖: 當線程嘗試獲取鎖失敗時(鎖已經被其它線程占用了),無限循環重試嘗試獲取鎖
阻塞鎖: 當線程嘗試獲取鎖失敗時,線程進入阻塞狀態,直到接收信號后被喚醒。在競爭激烈情況下,性能較高讀鎖: 共享鎖
寫鎖: 獨占排他鎖偏向鎖:一直被一個線程所訪問,那么該線程會自動獲取鎖
輕量級鎖:CAS):當鎖是偏向鎖的時候,被另一個線程所訪問,偏向鎖就會升級為輕量級鎖,其他線程會通過自旋的形式嘗試獲取鎖,不會阻塞,提高性能。
重量級鎖:當鎖為輕量級鎖的時候,另一個線程雖然是自旋,但自旋不會一直持續下去,當自旋一定次數的時候(10次),還沒有獲取到鎖,就會進入阻塞,該鎖膨脹為重量級鎖。重量級鎖會讓他申請的線程進入阻塞,性能降低。
以上其實是synchronized的鎖升級過程表級鎖: 對整張表加鎖,加鎖快開銷小,不會出現死鎖,但并發度低,會增加鎖沖突的概率
行級鎖: 是mysql粒度最小的鎖,只針對操作行,可大大減少鎖沖突概率,并發度高,但加鎖慢,開銷大,會出現死鎖

2、具體鎖實現:

1、jvm:

ReentrantLock悲觀的獨占的可重入的可公平可不公平鎖synchronized悲觀的獨占的可重入的非公平鎖無鎖 --> 偏向鎖(同一個線程再次獲取鎖) --> 輕量級鎖(自旋) --> 重量級鎖

2、mysql:

select ... for update:悲觀的獨占的
select ... lock in share mode

?

3、jvm:ReentrantLock + synchronized

	1.單個jvm實例 單機2.必須單例3.與事務并存問題總之,不適合于保證數據庫數據可靠性

?

4、mysql:

	1.直接更新時判斷。在更新中判斷庫存是否大于0 update table set surplus = (surplus - buyQuantity) where id = 1 and (surplus - buyQuantity) > 0 ;解決jvm鎖多例模式鎖失效問題 及 事務共存問題鎖范圍控制:條件字段必須創建索引;查詢條件必須具體的值同一個商品有多個庫存時,無法解決。無法記錄庫存變化前后的狀態2.悲觀鎖:select ... for update庫存操作要統一:不能有的操作是select ... for update 而有的操作是普通的select死鎖風險:多條記錄時,加鎖順序要一致阻塞及性能問題3.樂觀鎖:version 或者 時間戳(CAS思想)ABA問題失敗需要重試,高并發情況下性能不高讀寫分離情況下導致樂觀鎖不可靠

5、zookeeper

客戶端:ZooKeeper原生客戶端、ZkClient、Curator前兩個客戶端參照:https://blog.csdn.net/qq_42349306/article/details/118209298
讀操作和設置監聽事件之間是有原子性的阻塞公平鎖:1.接收到請求時,在/locks節點下創建一個臨時序列化節點2.判斷自己是不是/locks節點下最下的節點:是則獲取到鎖,不是則監聽前一個節點3.獲取到鎖,處理完業務邏輯后,通過delete刪除當前節點釋放鎖。監聽當前節點的下一個節點收到通知,重復第二步。

Curator分布式鎖源碼解讀:https://blog.csdn.net/qq_41432730/article/details/123389670

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

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

相關文章

可持續創新 精選路線

在加速企業數字化轉型、 實現智能制造的升級之路上! 使用好的工具固然重要, 而有好工具,也要會用工具。生信科技不僅為企業提供強大的產品支持, 更有全方位的定制化服務, 提升工程師的工具應用能力, 讓企業…

C++ Qt QFile用法介紹與代碼演示

作者:令狐掌門 技術交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目錄 打開和關閉文件讀取文件寫入文件示例代碼自定義格式文件解析在Qt 中 QFile 的類用于讀寫本地文件系統中的文件。它繼承自 QIODevice,所以它包含了許多用于數據輸入和輸出的功…

c++ 課程筆記

105課: cpp文件分為 .h .cpp .cpp 文件 110課:124課 深拷貝 淺拷貝 自建拷貝構造解決淺拷貝釋放new后堆區析構函數的問題 (淺拷貝 拷貝內存地址, 釋放堆區時 導致源數據 釋放時,該地址無數據?而報錯) 淺拷貝: 拷貝了對方的值和 堆區內存地址(刪除 影響原數據堆區) 深拷貝…

第二類曲線積分@對坐標的曲線積分

文章目錄 abstract對坐標的曲線積分變力沿曲線所做的功平均功(恒力做功)變力做工弧段微分第二類曲線積分的定義函數在曲線弧上連續推廣:空間曲線弧的第二類曲線積分常用形式和簡寫利用第二類曲線積分表示變力做功性質 計算方法證明對坐標 x x x對坐標 y y y相加積分限和曲線弧起…

文件批量重命名技巧:圖片文件名太長怎么辦?告別手動改名方法

在日常生活中,常常會遇到文件名過長導致的問題。尤其是在處理大量圖片文件時,過長的文件名可能會使得文件管理變得混亂不堪。現在來看下云炫文件管理器如何批量重命名,讓圖片文件名變得更簡潔,提高工作效率。 操作1、在云炫文件…

python運算符重載之字符串顯示和右側加法

1 python運算符重載之字符串顯示和右側加法 1.1 重載字符串顯示 1.1.1 str和repr python調用prin()t時,自動調用__str__和__repr__, python調用str()時,自動調用__str__和__repr__, python調用repr()時,自動調用_…

深入理解C語言指針基礎概念:定義、內存地址與聲明初始化

導言: 在C語言中,指針是一項強大而重要的概念,直接涉及內存的底層操作。理解指針的基礎概念對于熟練運用C語言以及理解底層系統工作原理至關重要。本文將深入研究指針的定義、內存地址的概念以及指針的聲明和初始化,幫助讀者建立對…

C++之unordered_map/set的使用

前面我們已經學習了STL中底層為紅黑樹結構的一系列關聯式容器——set/multiset 和 map/multimap(C98). unordered系列關聯式容器 在C98中, STL提供了底層為紅黑樹結構的一系列關聯式容器, 在查詢時效率可達到log2N,即最差情況下需要比較紅黑樹的高度次, 當樹中的節點非常多時,…

3 動態規劃解解碼問題

來源:LeetCode第91題 難度:中等 描述:一條包含字母A-Z的消息通過以下映射進行了編碼: A->1,B->2,z->26,要接嗎已編碼的消息,所有數字必須基于上述映射的方法,反向映射回字母(可能由多種方法),例…

MindStudio學習一 整體介紹

一場景介紹 二 安裝介紹 1.LINUX 采用無昇騰硬件采用linux 分部署 2.WINDOWS 3.linux下安裝整體步驟 3.1安裝依賴 3.2 安裝步驟 1.gcc cmake 等依賴 2.python3.7.5 3.pip 安裝依賴 4.安裝JDK 5.安裝 Ascend-cann-toolkit 6.解壓安裝Mindstudio 7.進入bin路徑 ./…

MySQL where 子句

文章目錄 前言MySQL where 子句語法 從命令提示符中讀取數據使用PHP腳本讀取數據后言 前言 hello world歡迎來到前端的新世界 😜當前文章系列專欄:Mysql 🐱?👓博主在前端領域還有很多知識和技術需要掌握,正在不斷努力…

Javascript的form表單校驗輸入框

以下是HTML代碼&#xff1a; <form name"myForm" onsubmit"return validateForm()"><label for"name">姓名&#xff1a;</label><input type"text" id"name" name"name"><br><l…

【ArcGIS Pro微課1000例】0035:柵格影像拼接(dem高程數據)

本實驗講解在ArcGIS Pro中,柵格數據的兩種拼接(鑲嵌)方法,適用于遙感影像、DOM、DEM、DSM等常見柵格數據。 文章目錄 一、加載實驗數據二、柵格拼接工具1. 鑲嵌2. 鑲嵌至新柵格三、注意事項四、拓展閱讀一、加載實驗數據 加載配套實驗數據中的0035.rar中的兩個dem數據,如…

455.分發餅干

原題鏈接&#xff1a;455.分發餅干 思路&#xff1a; 先使用大餅干喂飽大胃口的&#xff0c;再到剩余的里面用大餅干喂剩下大胃口的 &#xff0c;直到全部滿足或者喂不了了為止。 全代碼&#xff1a; class Solution { public:int findContentChildren(vector<int>&am…

【從刪庫到跑路】MySQL數據庫 — E-R圖 | 關系模型

&#x1f38a;專欄【MySQL】 &#x1f354;喜歡的詩句&#xff1a;更喜岷山千里雪 三軍過后盡開顏。 &#x1f386;音樂分享【如愿】 大一同學小吉&#xff0c;歡迎并且感謝大家指出我的問題&#x1f970; 文章目錄 &#x1f339;簡述什么是E-R圖?核心概念 &#x1f339;E-R圖…

LeetCode40. Combination Sum II

文章目錄 一、題目二、題解 一、題目 Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sum to target. Each number in candidates may only be used once in…

完美解決:Nginx訪問PHP出現File not found.

目錄 解決方法一&#xff1a; 解決方法二&#xff1a; 遇到 File not found. 出現的問題解決&#xff1a; 解決方法一&#xff1a; 修改nginx的主配置文件。 vi /etc/nginx/nginx.conf location ~ \.php$ { root html; fastcgi_pass …

unity Toggle,初始時默認不選中,若選中則不可取消選中。不寫碼實現其效果

實現效果&#xff1a; 初始默認時&#xff1a; 選中時&#xff1a; 零代碼實現&#xff1a; 步驟1 步驟2 步驟3

[autojs]ui線程中更新控件的值的問題

"ui"; ui.layout(<vertical><button id"autoFloatWindow" text"開啟懸浮窗" textSize"15sp" /><button id"autoService" text"開啟無障礙服務" textSize"15sp" /><button id"…

一篇總結 Linux 系統啟動的幾個匯編指令

學習 Linux 系統啟動流程&#xff0c;必須熟悉幾個匯編指令&#xff0c;總結給大家。 這里不是最全的&#xff0c;只列出一些最常用的匯編指令。 一&#xff0e;數據處理指令 1.數據傳送指令 【MOV指令】 把一個寄存器的值(立即數)賦給另一個寄存器&#xff0c;或者將一個…