19.悲觀鎖與樂觀鎖解析

1.悲觀鎖

悲觀鎖比較悲觀,它認為如果不鎖住這個資源,別的線程就會來爭搶,就會造成數據結果錯誤,所以悲觀鎖為了確保結果的正確性,會在每次獲取并修改數據時,都把數據鎖住,讓其他線程無法訪問該數據,這樣就可以確保數據內容萬無一失。

舉個例子

  • 假設線程 A 和 B 使用的都是悲觀鎖,所以它們在嘗試獲取同步資源時,必須要先拿到鎖。
  • 假設線程 A 拿到了鎖,并且正在操作同步資源,那么此時線程 B 就必須進行等待。
  • 而當線程 A 執行完畢后,CPU 才會喚醒正在等待這把鎖的線程 B 再次嘗試獲取鎖。
  • 如果線程 B 現在獲取到了鎖,才可以對同步資源進行自己的操作。這就是悲觀鎖的操作流程。

2.樂觀鎖

樂觀鎖比較樂觀,認為自己在操作資源的時候不會有其他線程來干擾,所以并不會鎖住被操作對象,不會不讓別的線程來接觸它,同時,為了確保數據正確性,在更新之前,會去對比在我修改數據期間,數據有沒有被其他線程修改過:如果沒被修改過,就說明真的只有我自己在操作,那我就可以正常的修改數據;

如果發現數據和我一開始拿到的不一樣了,說明其他線程在這段時間內修改過數據,那說明我遲了一步,所以我會放棄這次修改,并選擇報錯、重試等策略。

樂觀鎖的實現一般都是利用 CAS 算法實現的。

舉個例子:

  • 假設線程 A 此時運用的是樂觀鎖。那么它去操作同步資源的時候,不需要提前獲取到鎖,而是可以直接去讀取同步資源,并且在自己的線程內進行計算。
  • 當它計算完畢之后、準備更新同步資源之前,會先判斷這個資源是否已經被其他線程所修改過。
  • 如果這個時候同步資源沒有被其他線程修改更新,也就是說此時的數據和線程 A 最開始拿到的數據是一致的話,那么此時線程 A 就會去更新同步資源,完成修改的過程。
  • 而假設此時的同步資源已經被其他線程修改更新了,線程 A 會發現此時的數據已經和最開始拿到的數據不一致了,那么線程 A 不會繼續修改該數據,而是會根據不同的業務邏輯去選擇報錯或者重試。

3.相關用法

悲觀鎖:synchronized 關鍵字和 Lock 接口

Java 中悲觀鎖的實現包括 synchronized 關鍵字和 Lock 相關類等,我們以 Lock 接口為例,例如 Lock 的實現類 ReentrantLock,類中的 lock() 等方法就是執行加鎖,而 unlock() 方法是執行解鎖。處理資源之前必須要先加鎖并拿到鎖,等到處理完了之后再解開鎖,這就是非常典型的悲觀鎖思想。

樂觀鎖:原子類

樂觀鎖的典型案例就是原子類,例如 AtomicInteger 在更新數據時,就使用了樂觀鎖的思想,多個線程可以同時操作同一個原子變量。

數據庫

  • 數據庫中同時擁有悲觀鎖和樂觀鎖的思想。例如,我們如果在 MySQL 選擇 select for update 語句,那就是悲觀鎖,在提交之前不允許第三方來修改該數據,這當然會造成一定的性能損耗,在高并發的情況下是不可取的。
  • 相反,我們可以利用一個版本 version 字段在數據庫中實現樂觀鎖。在獲取及修改數據時都不需要加鎖,但是我們在獲取完數據并計算完畢,準備更新數據時,會檢查版本號和獲取數據時的版本號是否一致,如果一致就直接更新,如果不一致,說明計算期間已經有其他線程修改過這個數據了,那我就可以選擇重新獲取數據,重新計算,然后再次嘗試更新數據。
UPDATE studentSET name = ‘小李’,version= 2WHERE   id= 100AND version= 1

4.使用場景

悲觀鎖適合用于并發寫入多、臨界區代碼復雜、競爭激烈等場景,這種場景下悲觀鎖可以避免大量的無用的反復嘗試等消耗。

樂觀鎖適用于大部分是讀取,少部分是修改的場景,也適合雖然讀寫都很多,但是并發并不激烈的場景。在這些場景下,樂觀鎖不加鎖的特點能讓性能大幅提高。

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

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

相關文章

2023年亞太地區數學建模大賽 問題B

玻璃溫室中的微氣候法規 溫室作物的產量受到各種氣候因素的影響,包括溫度、濕度和風速[1]。其中,適宜的溫度和風速是植物生長[2]的關鍵。為了調節玻璃溫室內的溫度、風速等氣候因素,溫室的設計通常采用帶有溫室風扇的通風系統,如…

docker報錯

安裝 docker報錯: Docker Desktop requires the Server service to be enabled. 解決方法: 管理員身份打開cmd,輸入: services.msc開啟 server 服務。 docker啟動報錯: 打開 docker 界面報錯: Docke…

rabbit MQ的延遲隊列處理模型示例(基于SpringBoot延時插件實現)

rabbitMQ安裝插件rabbitmq-delayed-message-exchange 交換機由此type 表示組件安裝成功 生產者發送消息時設置延遲值 消息在交換機滯納至指定延遲后,進入隊列,被消費者消費。 組件注解類: package com.esint.configs;import org.springfra…

OpenAI再次與Altman談判;ChatGPT Voice正式上線

11月22日,金融時報消息,OpenAI迫于超過700名員工聯名信的壓力,再次啟動了與Sam Altman的談判,希望他回歸董事會。 在Sam確定加入微軟后,OpenAI超700名員工簽署了一封聯名信,要求Sam和Greg Brockman&#x…

Java檢測網絡是否正常通訊

Java是一種流行的編程語言,可以用于開發網絡應用程序。在網絡應用程序中,檢測IP地址和端口是否通常是必要的。本文將介紹如何使用Java檢測IP和端口。 Java檢測IP和端口的方法非常簡單。我們可以使用Java的Socket類來實現。下面的代碼片段演示了如何檢測…

用于 syslog 收集的協議:TCP、UDP、RELP

系統日志是從 Linux/Unix 設備和其他網絡設備(如交換機、路由器和防火墻)生成的日志 可以通過將 syslog 聚合到稱為 syslog 服務器、syslog 守護程序或 syslogd 的服務器來集中 syslog。在TCP、UDP和RELP協議的幫助下,系統日志從設備傳輸到系…

「快學Docker」監控和日志記錄容器的健康和性能

「快學Docker」監控和日志記錄容器的健康和性能 1. 容器健康狀態監控2. 性能監控3. 日志記錄幾種采集架構圖 4. 監控工具和平臺cAdvisor(Container Advisor)PrometheusGrafana 5. 自動化運維 1. 容器健康狀態監控 方法1:需要實時監測容器的運…

Zero-Shot Restoration of Back-lit Images Using Deep Internal Learning

ABSTRACT 如何恢復背光圖像仍然是一項具有挑戰性的任務。該領域最先進的方法基于監督學習,因此通常僅限于特定的訓練數據。在本文中,我們提出了一種用于背光圖像恢復的“零樣本”方案,該方案利用深度學習的力量,但不依賴于任何先…

孟德爾隨機化 MR入門基礎-簡明教程-工具變量-暴露

孟德爾隨機化(MR)入門介紹和分章分享(暫時不解讀) 大家好,孟德爾隨機化大火,但是什么是孟德爾隨機化,具體怎么實操呢 這沒有其他教程的繁冗,我這篇講最基礎的孟德爾隨機化的核心步…

Selenium瀏覽器自動化測試框架

介紹 Selenium [1] 是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome&#xff…

STM32_3(GPIO)

GPIO簡介 GPIO(General Purpose Input Output)通用輸入輸出口8種輸入輸出模式輸出模式可控制端口輸出高電平,驅動LED、蜂鳴器、模擬通信協議輸出時許等輸入模式可讀取端口的高低電平或電壓,用于讀取按鍵輸入、外接模塊電平信號輸…

【VRTK】【VR開發】【Unity】8-可交互對象

【概述】 之前我們只是用了一個簡單方塊作為可交互對象。其實可交互對象可以有許多細節設置,包括具體抓握物體的哪個點,指定抓握的方向,指定Secondary Action允許兩手互換抓握,雙手抓握,用兩手改變物體大小等。 【拾取物體】 要讓一個物體能夠被拾取,必須設置它為可互…

mysql解壓版安裝步驟linux

1. MySQL下載就不說了,以5.7版本舉例 2. 解壓安裝包 tar -zxvf mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz 3. 重命名目錄 mv mysql-5.7.41-linux-glibc2.12-x86_64 /usr/local/mysql 4. 創建mysql用戶組和用戶 groupadd mysql useradd -r -g mysql mysql …

十多位老鐵在公司搭建好了測試平臺

保守估計,目前有十多位小伙伴在公司搭建好了。 現在稍微詳細的講一下其中測試計劃的使用說明: (圖片有點小,可以點擊擴大查看) 1、進入測試計劃模塊,點擊“添加”,如下圖5.1: ▲圖 5…

NX二次開發UF_CAM_set_cam_preferences 函數介紹

文章作者:里海 來源網站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_set_cam_preferences Defined in: uf_cam.h int UF_CAM_set_cam_preferences(UF_CAM_preferences_p_t prefs ) overview 概述 This function sets the current settings of…

PTA-6-44 水果接口-工廠設計模式

用工廠設計模式編寫程序代碼。已知有如下Fruit接口,請編寫其子類Apple類與Orange類,另外再編寫一個Factory工廠類,具體要求如下。 需要編寫Fruit接口的子類: 兩個子類Apple和Orange,實現接口Fruit,并覆寫ea…

若依框架導出下載pdf/excel以及導入打印等

一、打印文件 // 報表打印 handlePdf(row) {wayAPI(row.billcode).then((res) > {var binaryData [];binaryData.push(res);let url window.URL.createObjectURL(new Blob(binaryData, {type: "application/pdf"})); window.open("/static/pdf/web/v…

【鴻蒙應用ArkTS開發系列】- 云開發入門實戰二 實現城市多級聯動Demo(上)

目錄 概述 云數據庫開發 一、創建云數據庫的對象類型。 二、預置數據(為對象類型添加數據條目)。 三、部署云數據庫 云函數實現業務邏輯 一、創建云函數 二、云函數目錄講解 三、創建resources目錄 四、獲取云端憑據 五、導出之前創建的元數據…

算法設計與分析復習

分支法 算法設計與分析復習–遞歸與分治(一) 算法設計與分析復習–遞歸與分治(二) 動態規劃 算法設計與分析復習–動態規劃 貪心 算法設計與分析復習–貪心(一) 算法設計與分析復習–貪心(二) 回溯法 算法設計與…

鴻蒙原生應用/元服務開發-AGC分發如何配置版本信息(下)

12.根據《工業和信息化部關于開展移動互聯網應用程序備案工作的通知》,自2023年9月初起,在中國大陸地區提供互聯網信息服務的APP開發者,需要依法履行APP備案手續,并通過APP分發平臺的備案信息核驗。 對于2023年9月7日后在AGC新上…