JavaEE 09 鎖策略

1.鎖策略

1.1 樂觀鎖與悲觀鎖

其實前三個鎖是同一種鎖,只是站在不同的角度上去進行描述,此處的樂觀與悲觀其實是指在預測的角度上看會發生鎖競爭的概率大小,概率大的則是悲觀鎖,概率小的則是樂觀鎖

樂觀鎖在加鎖的時候就會做較少的事情,加鎖的速度較快,但是消耗的cpu資源等也會增加,悲觀鎖在加鎖的時候就會做很多事情來避免鎖的沖突,從而加鎖的時候做的事情就比較多,加鎖的開銷相對較小

1.2 輕量級鎖與重量級鎖

這里是從加鎖的量級出發,本質上是和上面的悲觀鎖和樂觀鎖的意思差不多,意思是從結果的角度上看,輕量級的鎖加鎖開銷小,重量級的鎖加鎖開銷比較大

1.3 自旋鎖與掛起等待鎖

自旋鎖是輕量級鎖和樂觀鎖的一種典型實現方式,掛起等待鎖是重量級鎖的一種典型實現方式,自旋鎖就是有一個while循環來一直判斷是否需要加鎖,加上鎖了就跳出循環,加鎖不成功就繼續判斷而不是阻塞,這就導致了一直消耗了系統的資源而沒有做實事,所以說消耗了相對多的cpu資源

掛起等待鎖則與他截然相反,掛起等待鎖就需要內核調度器去參與操作了,所以要做的事情也就多了,所以需要獲取到鎖的時間也就多了

1.4 普通互斥鎖與讀寫鎖

普通互斥鎖類似于Synchronized,有加鎖和解鎖兩個動作

讀寫鎖則是兩種鎖

讀鎖和讀鎖之間不會有鎖沖突

寫鎖和讀鎖之間會有鎖沖突

寫鎖之間也會有鎖沖突

總結:一個線程加讀鎖的時候,另一個線程只能讀不能寫

一個線程加寫鎖的時候,另一個線程不能寫也不能讀

這個要和MySQL中事務的隔離級別要分得開

MySQL中的臟讀,不可重復讀,幻讀

我們以一個有一條數據的表為例,age=10

臟讀:事務A修改age =20,沒有提交事務,事務B讀取到這條數據之后,事務A回滾了,此時B就讀到了一條臟的數據

不可重復讀:事務B讀取到了age=10,此時事務A修改數據為20并提交事務,事務B又一次查詢數據,查到的兩條數據是不一樣的,這就是不可重復讀

幻讀:事務B查詢到一條數據,此時事務A又增加一條數據,此時事務B再次查詢就是兩條數據,這就稱為幻讀

不可重復讀和臟讀之間的區別是:不可重復讀讀取的事務是已經提交的

1.5 公平鎖與非公平鎖

與之前介紹的線程餓死有一定的聯系

這里的公平指的是先到先得,只要線程釋放鎖,第一個等待的線程可以率先拿到鎖,就不會出現持有鎖,釋放鎖,這樣的循環持有的狀態,導致其他線程沒辦法做事情

這就需要引入一個數據結構來實現先到先得這種特點

java原生的鎖其實就是非公平鎖,靠搶占式執行.

1.6 可重入鎖與不可重入鎖

我們之前說過,Synchronized就是一個可重入鎖,就是針對一個線程,不斷用這個鎖加鎖很多次,可重入鎖不會出現問題,因為可重入鎖只是增加了計數器,實際上仍然是只加了一層鎖結構,而可重入鎖就可能出現死鎖的情況

2.Synchronized的鎖優化策略

我們都說Synchronized有自適應的效果,能夠根據鎖沖突狀態確定自己是什么類型的鎖,那么到底是怎么回事呢??咱們慢慢說

Synchronized鎖其實有三種狀態,根據情況來逐級遞增,注意這里的鎖級別是不可降級的

1.偏向鎖狀態(假設沒線程來競爭鎖)

這里的核心思想就是懶漢模式的思想,用的時候再創建,能不加鎖就不加鎖,所謂的偏向鎖,就是給線程加上一個非常輕量級的標記,如果沒有人來競爭鎖,就直接省略這樣的加鎖的操作,有的話則升級為輕量鎖

2.輕量級鎖狀態(假設競爭較小)

此處的實現就是自旋鎖,優點是可以第一時間拿到鎖,缺點是比較消耗cpu資源

與此同時Synchronized也會計算鎖競爭的激烈程度,從而來判斷是否需要升級到重量級鎖

對于輕量級鎖來說,假設競爭這個鎖的線程很多,那么大多數線程此刻就處自旋的狀態,此刻就比較消耗cpu資源

3.重量級鎖狀態(假設競爭很大)

此時拿不到鎖的線程就不會選擇去自旋了,而是直接阻塞等待,直接讓出cpu,當線程釋放之后就會隨機分配一個線程來持有這個鎖

4.鎖消除策略

Synchronized會自動判斷線程加上的鎖是否有效,在編譯期間,如果判斷無效就會自動把這個鎖給干掉,比如說這里沒有涉及到多個線程對成員變量的修改等等

5.鎖粗化

會將多個細粒度的鎖,合并成一個粗粒度的鎖,避免了重復加鎖解鎖的過程

3.CAS策略 (避免使用鎖的另一種解決線程安全問題的策略)

全稱叫做compare and swap 就是比較和交換,其實是一個cpu指令

關于CAS的api都放在java的unsafe包內,也就是暫時不推薦去使用的

我們簡單介紹一下它的觀點與使用技巧

這里給出一段偽代碼

address:內存中的地址

expectValue:寄存器1中的值

swapvalue:寄存器2中的值

比較內存中的值和寄存器1的值是否相同,相同則直接交換(賦值),返回一個true不相同則無事發生,返回一個false

java標準庫也提供了很多原子類,保證了多線程操作一個數據是原子的,本質上就是基于cas的

我們這個時候用兩個線程給她進行自增50000次就會獲取到正確的結果,而不會出現線程安全問題了

原始標準庫里的代碼略顯復雜,這里我們使用簡化版本的進行說明

這里的一次自增操作是先拿到舊數據,然后使用cas進行操作,如果判斷相等則直接寫入內存,不相等則更新一下目前的舊值為內存中的最新值,從而進行自增,這里就不會出現線程安全問題了

如有問題,希望大家多多指正?

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

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

相關文章

排序算法-選擇/堆排序(C語言)

1基本思想: 每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的 數據元素排完 。 2 直接選擇排序: 在元素集合 array[i]--array[n-1] 中選擇關鍵碼最大 ( 小 ) 的數據元素…

PHP基礎 - 數組遍歷與排序

介紹 在PHP中,數組遍歷和排序是常見的操作,用于對數組中的元素進行訪問和排序 數組遍歷 1)數值數組的遍歷 使用 foreach 循環遍歷數組:foreach 循環是最常用的遍歷數組的方法,它可以遍歷索引數組和關聯數組。例如:$fruits = array("apple", "banana&q…

AG1KLPQ48 User Manual

1.)軟件安裝: 解壓縮或執行安裝文件,安裝 Supra 軟件。執行文件為 bin 目錄中的 Supra.exe。 運行 Supra,選擇菜單 File -> Import license,選擇 license 文件并導入 License。 2.)新建項目:…

Python與CAD系列高級篇(二十一)批量將橫向文本改豎向

0 簡述 本篇介紹以下功能開發:一次性選擇所有橫向文本并批量修改為豎向。 1 需求 需求: ① 用戶在cad中交互式選擇所有需要修改方向的文本。 ② 將所有文本方向由橫向改為豎向。 2 代碼實現 代碼實現: import win32com.client as win32 import pythoncomdef vtpnt(x, y, …

Elaticsearch 學習筆記

文章目錄 Elaticsearch 學習筆記一、什么是 Elaticsearch ?二、Elaticsearch 安裝1 es 安裝2 問題解決3 數據格式 三、索引操作1 PUT 請求:在postman中,向 ES 服務器發 PUT 請求(PUT請求相當于創建的意思)2 GET 請求&a…

Base64編碼解碼

一、Base64編碼技術簡介 Base64編碼是一種廣泛應用于網絡傳輸和數據存儲的編碼方式。它將原始數據轉換為可打印的字符形式,以便于傳輸和存儲。Base64編碼后的數據長度是原始數據長度的約3/4,具有一定的壓縮效果。 Base64編碼解碼 -- 一個覆蓋廣泛主題工…

【trino權威指南】使用trino詳解:trino client安裝、查詢sql、DBeaver連接trino、java通過JDBC連接trino

文章目錄 一. Trino CLI1. 安裝client2. 使用client執行sql 二. JDBC driver 連接Trino1. 通過DBeaver用戶界面連接2. JDBC Driver in java2.1. 環境配置2.2. 注冊和配置driver2.3. 連接參數2.4. 查詢例子 一. Trino CLI 1. 安裝client Trino CLI提供了一個基于終端的交互式s…

上海交通大學生存手冊PDF

強烈推薦所有大學生去閱讀《上海交通大學生存手冊》。雖然它可能有些冗長,但非常重要,因為它道出了大學教育的本質。 如果幾年前我能夠看到這本書,也許我的大學生活會有所不同。現在我將向正在上大學或者將要上大學的你推薦這本書。 無論你…

通過虛擬機安裝Open5GS 和UERANSIM記錄

目錄 wsl虛擬環境嘗試失敗 step1 安裝wsl: step2下載Ubuntu 20.04.6 LTS: step3升級wsl: step4生成用戶: step5 linux下安裝軟件需要的鏡像: step6 安裝圖形界面xfce和瀏覽器: step6 安裝chrome virtual box安裝ubuntu step7&#xf…

AWS攻略——Peering連接VPC

文章目錄 創建IP/CIDR不覆蓋的VPC創建VPC創建子網創建密鑰對創建EC2 創建Peering接受Peering邀請修改各個VPC的路由表修改美東us-east-1 pulic subnet的路由修改悉尼ap-southeast-2路由 測試知識點 我們回顧下《AWS攻略——VPC初識》中的知識: 一個VPC只能設置在一…

Android引用SDK包實現高德地圖展示

一、準備工作 注冊高德地圖開放平臺 注冊過程我就不多說了,挺簡單的,需要登錄,然后注冊成為開發者,還需要支付寶認證、手機號碼驗證、郵箱驗證挺多的,但是速度很快。基本上隨時驗證隨時注冊成功。新建應用新建…

在C語言中,%d,%c,%f都是什么意思

printf函數調用的一般形式 printf函數是一個標準庫函數,它的函數原型在頭文件“stdio.h”中。但作為一個特例,不要求在使用 printf 函數之前必須包含stdio.h文件。printf函數調用的一般形式為: printf(“格式控制字符串”,輸出表列…

重點車輛安全監測預警技術方案

目錄 1.系統架構 2.詳細設計 2.1駕駛員信息監控 2.1.1駕駛員基本信息管理 2.1.2人車匹配信息 2.1.3駕駛員在線狀態管理 2.2車輛狀態信息管理 2.2.1車輛信息管理 2.1.2車輛在路狀態管理 2.3重點車輛安全監測預警系統云平臺 2.3.1云平臺需求分析 2.3.2 設計思想 2.4.…

urllib 異常、cookie、handler及代理(四)

目錄 一、urllib異常 二、urllib cookie登錄 三、urllib handler 處理器的基本使用 四、urllib 代理和代理池 參考 一、urllib異常 URLError/HTTPError 簡介: 1.HTTPError類是URLError類的子類 2.導入的包urllib.error.HTTPError urllib.error.URLError 3.h…

18 Java與redis集群的通信

1、引入依賴 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.6.3</version></dependency>2、配置 # Redis集群服務器地址 redis.nodesaliyun:6900,aliyun:6901,aliyun:6902,aliyun…

20道計算機網絡面試題

網絡分層 1、說說OSI 七層、TCP/IP 四層的關系和區別&#xff1f; OSI 七層從下往上依次是&#xff1a;物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層。一張圖給你整明白&#xff1a; TCP/IP 四層從下往上依次是&#xff1a;網絡接口層、網絡層、傳輸層、應用…

MATLAB - 評估擬合優度、評價擬合效果

系列文章目錄 文章目錄 系列文章目錄前言一、如何評估擬合優度二、擬合優度統計2.1 SSE - 誤差引起的平方和2.2 R 平方2.3 自由度調整 R 平方2.4 均方根誤差 三、MATLAB - 評估曲線擬合度3.1 加載數據并擬合多項式曲線3.2 繪制擬合方程、數據、殘差和預測范圍圖3.3 評估指定點3…

java--Object

1.Object類的作用 Object類是java中所有類的祖宗類&#xff0c;因此&#xff0c;java中所有類的對象都可以直接使用Object類中提供一些方法 2.Object類的常見方法 ①toString存在的意義&#xff1a;toString()方法存在的意義就是為了被子類重寫&#xff0c;以便返回對象具體的…

【Python實戰系列】一文徹底搞懂異常捕獲及處理(理論+源碼)

一、問題 異常處理是Python中一種用于處理程序運行時錯誤的機制。在編寫代碼時&#xff0c;可能會出現各種不可預測的情況&#xff0c;例如除零錯誤、文件不存在、網絡連接問題等等。為了確保程序能夠在出現錯誤時正常運行&#xff0c;您可以使用異常處理機制來捕獲和處理這些異…

K8S學習指南(5)-k8s核心對象namespace

文章目錄 前言什么是Namespace&#xff1f;Namespace的類型創建Namespace使用kubectl創建Namespace示例 切換Namespace查看Namespace在Namespace中部署應用程序使用Namespace進行資源隔離Namespace的權限控制刪除Namespace總結 前言 Kubernetes&#xff08;簡稱K8s&#xff09…