山東大學軟件學院項目實訓-創新實訓-基于大模型的旅游平臺(十九)- JUC(5)

synchronized優化原理

輕量級鎖

如果一個對象有多個線程訪問,但多線程訪問的時間是錯開的(沒有競爭),可以用輕量級鎖優化

  @Slf4j(topic = "c.ExerciseTransfer")public class Test {?static final Object obj = new Object();public static void main(String[] args) throws InterruptedException {synchronized (obj){method();}}?public static void method(){synchronized (obj){}}}

讓鎖記錄中 Object reference 指向鎖對象,并嘗試用 cas 替換 Object 的 Mark Word,將 Mark Word 的值存 入鎖記錄

如果 cas 替換成功,對象頭中存儲了 鎖記錄地址和狀態 00 ,表示由該線程給對象加鎖,這時圖示如下。

如果 cas 失敗,有兩種情況

  • 如果是其它線程已經持有了該 Object 的輕量級鎖,這時表明有競爭,進入鎖膨脹過程

  • 如果是自己執行了 synchronized 鎖重入,那么再添加一條 Lock Record 作為重入的計數

當退出 synchronized 代碼塊(解鎖時)如果有取值為 null 的鎖記錄,表示有重入,這時重置鎖記錄,表示重入計數減一。

當退出 synchronized 代碼塊(解鎖時)鎖記錄的值不為 null,這時使用 cas 將 Mark Word 的值恢復給對象頭

  • 成功,則解鎖成功

  • 失敗,說明輕量級鎖進行了鎖膨脹或已經升級為重量級鎖,進入重量級鎖解鎖流程

鎖膨脹

如果在嘗試加輕量級鎖的過程中,CAS 操作無法成功,這時一種情況就是有其它線程為此對象加上了輕量級鎖(有 競爭),這時需要進行鎖膨脹,將輕量級鎖變為重量級鎖。

這時 Thread-1 加輕量級鎖失敗,進入鎖膨脹流程

  • 即為 Object 對象申請 Monitor 鎖,讓 Object 指向重量級鎖地址

  • 然后自己進入 Monitor 的 EntryList BLOCKED

當 Thread-0 退出同步塊解鎖時,使用 cas 將 Mark Word 的值恢復給對象頭,失敗。這時會進入重量級解鎖 流程,即按照 Monitor 地址找到 Monitor 對象,設置 Owner 為 null,喚醒 EntryList 中 BLOCKED 線程。

自旋優化

重量級鎖競爭的時候,還可以使用自旋來進行優化,如果當前線程自旋成功(即這時候持鎖線程已經退出了同步塊,釋放了鎖),這時當前線程就可以避免阻塞。

偏向鎖

輕量級鎖在沒有競爭時(就自己這個線程),每次重入仍然需要執行 CAS 操作。

Java 6 中引入了偏向鎖來做進一步優化:只有第一次使用 CAS 將線程 ID 設置到對象的 Mark Word 頭,之后發現這個線程 ID 是自己的就表示沒有競爭,不用重新 CAS。以后只要不發生競爭,這個對象就歸該線程所有。例如:

  static final Object obj = new Object();public static void m1() {synchronized( obj ) {// 同步塊 Am2();}}public static void m2() {synchronized( obj ) {// 同步塊 Bm3();}}public static void m3() {synchronized( obj ) {// 同步塊 C}}

偏向狀態

之所以要用偏向鎖是因為輕量級鎖的鎖重入每次都調用CAS進行對比,CAS是一個OS指令操作,速度很慢。所以偏向鎖是把ThreadId直接賦值給markword,那么下次能直接在java上對比這個markword。

  1. 偏向鎖帶有延遲性,通常對象創建過一會才會生成

  2. 先生成偏向鎖->輕量級鎖->重量級鎖

  3. 如果給臨時區使用偏向鎖,那么對應執行線程的id賦值給markword

  4. 如果使用了鎖的hashcode,那么偏向鎖就會被禁止,因為hashcode占用的bit太多。

  5. 輕量級在鎖記錄上記錄hashcode,重量級在monitor上記錄

  6. 如果兩個線程用同一個偏向級鎖,那么鎖會變成不可偏向,升級為輕量級鎖。

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

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

相關文章

關于陽光雨露外派聯想的面試感想

最近在找工作,接到了一個陽光雨露外派聯想的面試邀請。說實在的一開始就有不對勁的感覺。想必這就是大廠的自信吧,上就問能不能現場面試,然后直接發面試邀請。這時候我倒是沒覺得有啥問題。 然后今天就去面試去了,住的比較偏&…

【研發日記】【策劃向】(一)游戲策劃其實就是一道加減法題

文章目錄 序設計的過程其實是控制自己欲望的過程我海納百川,你要不要看看?我跟別人不一樣!我的人設就是沒有人設,或者說任何人設都是我的人設 記 序 不知不覺進入這個行業幾年了,也經歷了獨立開發和團隊開發的過程。在…

欣賞倪詩韻青桐斷紋古琴很罕見:萬中無一。

欣賞倪詩韻青桐斷紋古琴很罕見:萬中無一。龍池側簽海門倪詩韻制,帶收藏證書此琴斷紋優美如江面波光粼粼,為流水蛇腹斷,是倪老師作品精品中的精品。細心的朋友可以看出倪老師在這張琴上題字非常小心認真。用一個詞來形容——萬中無…

CPython3.7.9源碼學習一:C語言基礎、整數對象

C 語言基礎 結構體 // struct(關鍵字) 名稱 {結構體成員};// 定義結構體 struct Student { char name[50]; int age; float score; };// 初始化 結構體變量 struct Student stu1; strcpy(stu1.name, "張三"); stu1.age 20; stu1.score 90.5;// 初始化 …

Spring Boot線程池的 使用

一.異步方法 1.啟動類加EnableAsync注解 2.在需要異步執行的方法上添加Async注解 3.直接調用 結論:異步方法是通過SpringBoot中自動注入的線程池任務執行器實現的 二.自定義線程池 1.創建線程的配置類 2.使用Async注解時指定名稱 3.結論 手動注入多個線程池任務執…

Java 18新特性

Java 18引入了一系列新的特性和改進,這些更新覆蓋了從基本語言構造到更高級別的API等多個方面。以下是一些Java 18的主要新特性: 模式匹配增強:Java 18改進了模式匹配功能,使其更加強大和易于使用。開發人員可以使用模式匹配來簡…

Linux echo命令(在終端輸出文本)

文章目錄 Linux Echo命令深度解析簡介命令語法常見選項- -n:不輸出行尾的換行符,這意味著輸出后不會換到下一行。- -e:啟用反斜杠轉義的解釋,允許使用特殊字符。- -E:禁用反斜杠轉義的解釋(默認選項&#x…

基于地理坐標的高階幾何編輯工具算法(2)——相交面裁剪

文章目錄 工具步驟應用場景算法輸入算法輸出算法示意圖算法原理后處理 工具步驟 選中一個需要裁剪的面,點擊“相交面裁剪”工具,多選裁剪模板面,空格執行。 應用場景 常用于基于遙感影像的建筑物幾何面編輯。 算法輸入 一個待裁剪的面&a…

sqlserver的查詢(三)

目錄 10. group by(分組) 11. having(對分組后的信息過濾) 可能從這里開始,執行順序越來越顯得重要了!!! 10. group by(分組) 這個查詢相比前面會有一些困難; 格式:group by 字段的集合; 功…

Java進階學習筆記8——單繼承、Object類、方法重寫

Java 是單繼承的,Java中的類不支持多繼承,但是支持多層繼承。 Object類是所有類的父類。 Java不支持多類繼承: Java支持多層繼承: 反證法: Object類: Object類是java所有類的祖宗類,我們寫的任…

AI爆文寫作:我一般不告訴別人的爆文玩法:如何100%抄襲10W+的爆文標題,讓你也篇篇爆款

有現成的10w擺在眼前我們要做的就是,100%抄標題,以及內容重述。 具體操作步驟: 找到適合自己賬號選題的10w(微信看一看或者頭條)100%抄爆文的標題將這篇文章喂給Al,讓AI分析文章的寫法和主題根據提煉出來的寫法和主題&#xff0…

使用魚香肉絲一鍵安裝重新安裝ROS后mavros節點報錯,.so文件不匹配

解決方案: 1、寫在mavros相關軟件,共卸載7個包 sudo apt-get remove ros-melodic-mav*2、重新安裝mavros,共安裝10個包 sudo apt-get remove ros-melodic-mav*

每日AIGC最新進展(10):符號音樂生成SYMPLEX、新型圖像編輯數據集ReasonPix2Pix、角色一致性插畫生成、高級的風格個性化擴散模型

Diffusion Models專欄文章匯總:入門與實戰 SYMPLEX: Controllable Symbolic Music Generation using Simplex Diffusion with Vocabulary Priors http://arxiv.org/abs/2405.12666v1 本文介紹了一種新的符號音樂生成方法,名為SYMPLEX,它基于…

pod 庫發布腳本

repo_tag.sh 文件 #!/bin/zsh# 私有庫名稱 #PODNAME${PWD##*/} PODNAME"LBHorizontalCenterLayout"function obtain_git_tag {# 類似 "s.version 0.0.1"VERSION_STRINGgrep -E s.version.* ${PODNAME}.podspecTAGtr -cd "[0-9.]" <<&…

使用 JavaParser 解析代碼

[自用] 如何判斷出 java 代碼文本中一個方法的輸入參數個數以及類型。用結構體數組存儲遍歷信息&#xff0c;最后用一個方法實現打印。可以使用第三方庫。 如果是一個語句如何判斷這個語句中的局部變量個數和類型。那么該怎么實現呢&#xff1f; 要判斷 Java 代碼文本中一個方…

【電源專題】什么是層間短路(Rare Short),如何檢測?

層間短路發生的原因 一般線圈類制品是以漆包線纏繞導磁材料制造而成,漆包線是指外層披覆一層薄薄絕緣漆的銅線。我們常見的線圈類制品有: 電源變壓器、 高壓變壓器、 Switching Power 變壓器、 通訊變壓器、 脈沖變壓器、 環型變壓器、 電力傳輸變壓器、 音頻傳輸變壓器、 電…

k8s pvc pending waiting for first consumer to be created before binding

動態創建PV失敗且提示waiting for first consumer to be created before binding 問題現象 使用WaitForFirstConsumer的StorageClass創建PV失敗&#xff0c;PVC Event提示persistentvolume-controller waiting for first consumer to be created before binding。 問題原因 PV…

c# mysql 加鎖解鎖

c# mysql 加鎖解鎖 在C#中操作MySQL實現加鎖和解鎖&#xff0c;通常是通過執行特定的SQL語句來完成。MySQL支持表級鎖定和行級鎖定。以下是使用MySQL命令執行加鎖和解鎖的示例代碼&#xff1a; using MySql.Data.MySqlClient;// 連接字符串 string connStr "serverloca…

【QGIS入門實戰精品教程】5.3:CGCS2000轉Lambert投影

參考閱讀: 【GlobalMapper精品教程】081:WGS84/CGCS2000轉Lambert投影 文章目錄 一、加載實驗數據二、投影轉換三、批量投影轉換一、加載實驗數據 加載配套實驗數據,如下圖所示:圖層為長沙市范圍、長沙市酒店賓館分布點位、湖南省酒店分布點位矢量數據。 雙擊圖層,打開信…

網段與廣播域

ip地址與子網掩碼做與運算得到網絡號&#xff0c;得到的網絡號相同就是同一個網段&#xff0c;否則不是&#xff0c;跟他們在什么位置沒有任何關系 這里面pc3和前兩個pc雖然不在同一個網段&#xff0c;但是pc1發廣播包的時候&#xff0c;pc3也能收到&#xff0c;因為路由器的所…