學習筆記9——JUC三種量級的鎖機制

學習筆記系列開頭慣例發布一些尋親消息

鏈接:https://baobeihuijia.com/bbhj/contents/3/197325.html
在這里插入圖片描述

  • 多線程訪問共享資源沖突

    • 臨界區:一段代碼塊存在對共享資源的多線程讀寫操作,稱這段代碼塊為臨界區

    • 競態條件:多個線程在臨界區內執行,由于代碼的執行序列不同導致結果無法預測,稱發生了競態條件

  • 一些線程安全的例子(什么時候加鎖什么時候不加):

    • 局部變量是線程安全的(每個線程創建的棧內部獨立擁有)
      在這里插入圖片描述

    • 局部變量引用的對象:如果用的對象的公共變量,需要加鎖,因為對象在堆內
      在這里插入圖片描述

    • 局部變量引用的對象:如果用的是對象方法內的局部變量**(雖然這種情況下每個線程在堆內單獨擁有對象使用權,但是如果子類重寫方法,新加了線程,那么也會出現兩個線程共享局部變量的情況,所以盡量用final或者private將父類保護起來)**

    在這里插入圖片描述

    • 線程安全類:

      • string:在定義string類的時候,就已經聲明了final,所以不會出現子類繼承string,并且修改string的讀寫邏輯為多線程,所以對于單獨一個string來說,我們的讀寫是安全的,因為只有有一個線程進行讀寫,但是多個方法的組合之間可以插入不同的別的線程,所以不是原子或者說不是安全的。
        在這里插入圖片描述
  • 在這里插入圖片描述

  • 重量級鎖——synchronized【父母考核:我聽父母的,父母來決定我的owner,當追求者很多時,采用這種方案】

    • 加鎖room,別的線程會進入block,直到本線程釋放鎖,才會喚醒別的block線程,在這個過程中就算時間片輪完該線程,其他線程也無法喚醒

    • 用對象鎖的形式保證了臨界區代碼的原子性,避免多個線程一起執行同一段臨界區代碼,如果這個鎖沒有被用,那么就可以執行這段代碼

    • 鎖住對象和鎖住類對象是不同的,并不互斥(也就是說,在執行鎖住對象的時候,當這輪cpu片時間耗盡,cpu也會去執行鎖住類對象的操作,類對象鎖不會被阻塞)

      # 方法一
      synchronized(對象)# 方法二
      class Room {private int counter = 0;// 等價于 synchronized(this)public synchronized void increment() {counter++;}public synchronized void decrement() {counter--;}public synchronized int getCounter() {return counter;}
      }# 方法三
      class Test{// 等價于synchronized(Test.class)public synchronized static void test(){}
      }
      
    • Monitor

      • 對象頭

        • 普通對象:32bit的Mark Word(25位hashcode,每個對象都有自己的哈希碼,4位的GC分代,鎖狀態標志)+32bit的Klass Word(類型指針)
      • 數組對象:32bit mark word + 32bit klass word + 32bit的 數組長度

      外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

    • synchronized的原理:

      • 每次線程遇到synchronized(obj),會去檢查obj是否指向操作系統中的一個monitor,如果沒有指向那就將obj對象的mask word 修改為monitor的地址,并將鎖標志位從01改為10,將該線程置為monitor的Owner
      • 在此期間如果別的線程執行遇到synchronized(obj),那么就會索引到monitor,發現已經有別的owner,進入entrylist 變為BLOCKED狀態
      • 當前owner執行完成后,隨機喚醒一個BLOCKED線程,最后退出該對象時將自己的markword重置為hashcode等

      外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

    • 重量級鎖的線程自旋優化

      • 為了避免線程阻塞,發生上下文切換,從而自旋等待解鎖
      • 適合多核cpu,單核的cpu沒有自旋的意義,因為沒有額外的cpu可以來執行自旋(需要等你結束我才能執行,但是我還總要中途打擾你問你好了沒)
      • 自旋失敗:幾次自旋重試后還是得不到鎖就進行阻塞
  • 輕量級鎖(操作系統自動創建,不需要我們顯式定義)【私定終生,我來決定我的owner】

    • 加鎖:線程中創建一個LOCK RECORD 00表示輕量級鎖,與對象頭交換mask信息(類似于一種密碼機制,只有當前線程完成后,才會把密碼信息還給對象,別人來訪問交換時這個對象已經是加鎖狀態)

    • 鎖重入:當前線程已經拿到鎖了,但是又執行了一遍synchronized(obj),這時會新建一個LOCK RECORD 00棧幀,數據這里會存儲null,說明其他棧幀已經拿到鎖了

    • 解鎖:如果是null,直接清除即可,不是null則需要將mask word恢復給對象

    外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

    • 鎖膨脹(追求者很多產生了競爭,發現決定權給到父母后,就需要與父母溝通)

      • 線程加輕量級鎖失敗,進入鎖膨脹流程,變成重量級鎖(修改原始密碼為monitor地址,owner置為當前線程,后續線程進入阻塞)
      • 原來線程的輕量級鎖解鎖失敗(因為密碼匹配不對,對象的密碼現在是monitor地址),需要進入重量級鎖的解鎖流程,即找到monitor對象,將owner置為null,并喚醒阻塞線程

    外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

  • 偏向鎖(只有一個線程一直重復用偏向——》有別的線程也來用該對象就會撤銷變為輕量級鎖——》鎖之間有競爭交互就用重量級)

    • 原始:將對象的mask word與新建鎖棧幀的頭部信息交換(鎖重入都會嘗試交換信息,造成資源浪費)

    • 偏向:將對象的mask word修改為線程ID,鎖重入就不會新建鎖棧幀

    • 當前線程id釋放后,線程id還是不會改變,該對象已經從屬于該主線程

    • 外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

    • ban掉偏向鎖的方法

      • 當一個可偏向的對象調用了hashcode就會ban掉偏向鎖
      • 當對象已經偏向一個線程了,另一個線程也來用該對象,但是不競爭,就會變為輕量級(線程id部分變為鎖記錄指針),如果競爭交互就是重量級
      • 調用wait,notify也會撤銷,因為wait,notify只有重量級有
    • 批量重偏向

      • 超過一定閾值數量(20)的對象都在撤銷偏向鎖,就會認為偏向設置的線程有誤,因此會將所有的對象偏向鎖改為別的線程
      • 撤銷的性能消耗比較大
      • 批量執行
    • 批量撤銷

      • 撤銷超過閾值(40)的對象都在撤銷偏向鎖換輕量級(說的是所有線程的總數),偏向就要求整個類原始對象和新對象不再偏向,直接輕量級
  • JIT即時編譯進行逃逸分析

  • sleep和wait的區別(狀態都是timewaiting)

    • sleep是線程的方法,執行時不會放棄鎖:相當于屋子內的人把門鎖死,直到醒來檢查一下資源是否滿足

    • wait是對象A的方法,會放棄鎖,需要notify叫醒:屋子內的人發現缺資源就出來在門外等著A.wait(),等到資源滿足執行notify【這種方法可以通過資源的識別需要通過while條件來判斷】

      • synchronized(lock){while(資源不滿足){lock.wait();}// 干活
        }synchronized(lock){lock.notifyAll()
        }
        

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

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

相關文章

Linux OpenMP使用總結

當涉及到編寫 Linux OpenMP 程序時,以下是體會: 了解 OpenMP 基礎:在使用 OpenMP 進行并行編程之前,確保您了解并行編程的基本概念和 OpenMP 的工作原理。您可以參考 OpenMP 的官方文檔或其他相關資源來獲取更多信息。配置 OpenM…

#HarmonyOS:@Styles裝飾器:定義組件重用樣式

Styles可以定義在組件內或全局,在全局定義時需在方法名前面添加function關鍵字,組件內定義時則不需要添加function關鍵字。 組件內Styles的優先級高于全局Styles。 框架優先找當前組件內的Styles,如果找不到,則會全局查找。 // …

GO設計模式——3、抽象工廠模式(創建型)

目錄 抽象工廠模式(Abstract Factory Pattern) 抽象工廠模式的核心角色 優缺點 代碼實現 抽象工廠模式(Abstract Factory Pattern) 抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他…

單詞倒排

對字符串中的所有單詞進行倒排。 說明: 1、構成單詞的字符只有26個大寫或小寫英文字母; 2、非構成單詞的字符均視為單詞間隔符; 3、要求倒排后的單詞間隔符以一個空格表示;如果原字符串中相鄰單詞間有多個間隔符時,倒排…

yolo目標檢測+目標跟蹤+車輛計數+車輛分割+車道線變更檢測+速度估計

這個項目使用YOLO進行車輛檢測,使用SORT(簡單在線實時跟蹤器)進行車輛跟蹤。該項目實現了以下任務: 車輛計數車道分割車道變更檢測速度估計將所有這些詳細信息轉儲到CSV文件中 車輛計數是指在道路上安裝相應設備,通過…

windows下 Tomcat啟動黑框隱藏

進入到 tomcat/bin 目錄下,找到此文件 setclasspath.bat ,右鍵文本打開 找到此屬性 : set _RUNJAVA"%JRE_HOME%\bin\java.exe"修改成以下屬性,保存文件,重啟啟動tomcat會發現黑框不默認彈出了: …

使用hutool工具生成非對稱加密公私密鑰以及使用案例

1.導入hutool依賴 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.18</version></dependency>2.直接復制代碼 package com.common.utils;import cn.hutool.core.codec.Base64; i…

僅需30秒完美復刻任何人的聲音 - 最強AI音頻11Labs

我的用詞一直都挺克制的&#xff0c;基本不會用到“最強”這個字眼。 但是這一次的這個AI應用&#xff0c;是我認為在TTS&#xff08;文字轉音頻&#xff09;這個領域&#xff0c;當之無愧的“最強”。 ElevenLabs&#xff0c;簡稱11Labs。 僅需30秒到5分鐘左右的極少的數據集…

機器學習-分類問題

前言 《機器學習-回歸問題》知道了回歸問題的處理方式,分類問題才是機器學習的重點.從數據角度講,回歸問題可以轉換為分類問題的微分 邏輯回歸 邏輯回歸&#xff08;Logistics Regression&#xff09;,邏輯回歸雖然帶有回歸字樣&#xff0c;但是邏輯回歸屬于分類算法。但只可…

極大提升GPT-4等模型推理效率,微軟、清華開源全新框架

隨著用戶需求的增多&#xff0c;GPT-4、Claude等模型在文本生成、理解、總結等方面的能力越來越優秀。但推理的效率并不高&#xff0c;因為&#xff0c;多數主流模型采用的是“順序生成詞”方法&#xff0c;會導致GPU利用率很低并帶來高延遲。 為了解決這一難題&#xff0c;清…

美國Linux服務器的iptables防火墻介紹

美國Linux服務器防火墻一般分為硬件防火墻和軟件防火墻&#xff0c;但不論是硬件防火墻還是軟件防火墻&#xff0c;都需要通過使用硬件作為聯機的介質&#xff0c;也需要使用軟件來設定美國Linux服務器安全政策&#xff0c;因此可以從使用的硬件與操作系統來加以區分。硬件防火…

oracle怎么推進scn?

很多時候&#xff0c;數據庫有故障打不開&#xff0c;需要用到推進scn的技術&#xff0c;這里介紹下12c及以上版本的oracle怎么推進數據庫的scn。 經測試發現&#xff0c;數據庫mount和open狀態下都可以通過此方法推進SCN。 Session1&#xff1a; 查詢當前SCN SQL> select c…

基于jsp+servlet的圖書管理系統

基于jspservlet的圖書管理系統演示地址為 圖書館后臺管理系統 用戶名:mr ,密碼:123 圖書館管理系統主要的目的是實現圖書館的信息化管理。圖書館的主要業務就是新書的借閱和歸還&#xff0c; 因此系統最核心的功能便是實現圖書的借閱和歸還。此外&#xff0c;還需要提供圖書…

Stable Diffusion XL on diffusers

Stable Diffusion XL on diffusers 翻譯自&#xff1a;https://huggingface.co/docs/diffusers/using-diffusers/sdxl v0.24.0 非逐字翻譯 Stable Diffusion XL (SDXL) 是一個強大的圖像生成模型&#xff0c;其在上一代 Stable Diffusion 的基礎上主要做了如下優化&#xff1a;…

生產上線需要注意的安全漏洞

一、關閉swagger 1、關閉swagger v3 # 需同時設置auto-startupfalse&#xff0c;否則/v3/api-docs等接口仍能繼續訪問 springfox:documentation:enabled: falseauto-startup: falseswagger-ui:enabled: false 2、關閉swagger v2 # 只要不是true就不啟用 swagger:enable: fa…

深度解讀:淘客返利機器人無限制與免費版的差異

深度解讀:淘客返利機器人無限制與免費版的差異 在數字時代&#xff0c;人工智能和大數據技術的飛速發展正在改變我們的生活方式&#xff0c;尤其在購物領域&#xff0c;各種優惠工具如雨后春筍般涌現。其中&#xff0c;淘客返利機器人和微賺淘客系統以其獨特的優勢&#xff0c…

Python核心編程之序列下篇

目錄 十二、列表 如何創建列表類型數據并給它賦值 如何訪問列表中的值

代立冬:基于Apache Doris+SeaTunnel 實現多源實時數據倉庫解決方案探索實踐

大家好&#xff0c;我是白鯨開源的聯合創始人代立冬&#xff0c;同時擔任 Apache DolphinScheduler 的 PMC chair 和 SeaTunnel 的 PMC。作為 Apache Foundation 的成員和孵化器導師&#xff0c;我積極參與推動多個開源項目的發展&#xff0c;幫助它們通過孵化器成長為 Apache …

如何訪問內部網絡做內網穿透

項目&#xff1a;https://github.com/ehang-io/nps 有個公網服務器&#xff0c;搭建服務端。 然后客戶端使用&#xff1a; -server是服務端的訪問方式。-vkey是秘鑰。 ./npc -server192.227.19.12:8024 -vkeyoies8gq3wml -typetcp然后在服務端配置TCP隧道即可。

某度旋轉驗證碼v2 逆向分析

v2主要依據是核心 JS 文件mkd_v2.js 版本&#xff0c;如下圖所示&#xff1a; 第一次 https://passport.baidu.com/cap/init 接口&#xff0c;請求的 ak 是固定值&#xff0c;當然不同場景不同網站是不一樣的&#xff0c;_ 時間戳&#xff0c;ver1&#xff0c;返回值 as、tk 都…