【java八股文】深入淺出synchronized優化原理

在這里插入圖片描述

🔍 開發者資源導航 🔍
🏷? 博客主頁: 個人主頁
📚 專欄訂閱: JavaEE全棧專欄

synchronized優化原理

synchronized即使悲觀鎖也是樂觀鎖,擁有自適應性。 jvm內部會統計每個鎖的競爭激烈程度,自動識別。

它在運行時主要有三種優化策略。

鎖升級

路徑

無鎖->偏向鎖->自旋鎖->重量級鎖

如果對于這些概念不清楚可以參考這篇文章->點我

無鎖->偏向鎖
所謂偏向鎖就是進行一個簡單的標記,并不是真正的加鎖,這個標記非常的輕量,相對于加鎖高效的多。

如果到最后沒人和它競爭這個鎖,那么到最后只需要清除簡單的標記。

偏向鎖->自旋鎖

在偏向鎖的情況下遇到了鎖競爭,那么他會在其他線程加鎖之前對它先進行加自旋鎖的操作。

自旋鎖->重量級鎖

如果這個鎖的競爭情況非常激烈,就會對這個鎖升級到重量級鎖。

在jvm只提供了鎖升級,并沒有涉及鎖降級操作。

鎖消除:

編譯器優化的一種體現

編譯器會判定,當前的這個代碼邏輯是否真的需要加鎖,如果確實不需要加鎖,但是你寫了synchronized,就會自動去掉。

這個判定比較保守,只有100%確認這個代碼是單線程的時候才會觸發,當判斷不清楚的時候不會觸發,因此不會出現判斷邏輯錯誤導致的線程安全。

鎖粗化:

鎖的粒度:加鎖和解鎖之間,包含的代碼越多,就認為鎖的粒度越粗,如果越少,就認為越細。這里代碼指的是實際執行的指令/時間。

如果檢測到一連串連續的對同一個對象的加鎖和解鎖操作(即使沒有競爭),JVM 可能會將這些操作合并為一個更大范圍的加鎖,減少鎖的獲取和釋放次數,從而提高性能。

優化前(細粒度鎖,效率低)

synchronized (obj) {// 操作1
}
synchronized (obj) {// 操作2
}
synchronized (obj) {// 操作3
}

優化后(鎖粗化,合并為一個鎖)

synchronized (obj) {  // JVM 可能會合并成一個鎖// 操作1// 操作2// 操作3
}

感謝各位的觀看Thanks?(・ω・)ノ,如果覺得滿意的話留個關注再走吧。

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

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

相關文章

生成式 AI 的重要性

在科技飛速發展的今天,我們正站在一個前所未有的變革節點上。生成式 AI,宛如一顆突然劃破夜空的耀眼流星,以其強大的創造力和無限的可能性,迅速成為全球矚目的焦點。它究竟有何等魔力,能在如此短的時間內引發如此巨大的轟動?這背后又隱藏著怎樣的時代密碼,等待著我們去解…

生成式 AI 的闡釋

在科技浪潮的洶涌推動下,一個全新的時代正以前所未有的速度向我們奔來,生成式 AI 無疑是這股浪潮中最耀眼的浪尖。它究竟是什么?又將如何重塑我們的世界?這不僅是科技愛好者們熱衷探討的話題,更是關乎每一個人未來發展的重要命題。 生成式 AI,從本質上來說,是一種能夠自…

C++ 中 virtual 的作用

文章目錄 1. 用于虛繼承2. 用于抽象基類3. 用于多態 C 的 virtual 關鍵字,常見有 3 種用途:虛繼承、抽象基類和多態。 1. 用于虛繼承 virtual 用于虛繼承時,主要是為了解決菱形繼承中的重復繼承同名成員問題。使用形式如下 class Derived:…

軟件測試52講學習分享:深入理解單元測試

課程背景 最近我在學習極客時間的《軟件測試52講》課程,這是由騰訊TEG基礎架構部T4級專家茹炳晟老師主講的認證課程。作為數字化轉型與人工智能(DTAI)產業人才基地建設中心的認證課程,內容非常專業實用。今天想和大家分享第3講"什么是單元測試&…

Java SE(7)——類和對象(二)

1.包(package) 1.1 包的定義 在Java中,包是一種用于組織和管理類,接口和其他包的機制。主要作用是防止命名沖突,并提供一種訪問控制機制 1.2 package關鍵字 package關鍵字的主要作用是聲明當前類在哪個包里面。 當然,用戶也可以…

Manus聯合創始人:公司產品基于Claude和阿里千問大模型開發

3月11日消息,日前,Manus官方在社交平臺轉發了公司聯合創始人、首席科學家季逸超對Manus的技術解讀,季逸超在評論區回復網友關于“Manus使用了哪一個基礎大模型”這一問題時回復稱,“我們用過Claude,也用過不同版本的Qw…

欺騙單頁應用(SPA)渲染隱藏路由 -- trouble at the spa b01lersCTF

題目信息:I had this million-dollar app idea the other day, but I can’t get my routing to work! I’m only using state-of-the-art tools and frameworks, so that can’t be the problem… right? Can you navigate me to the endpoint of my dreams? 題目…

大數據引領行業革命:深度解析與未來趨勢

??個人主頁??:慌ZHANG-CSDN博客 ????期待您的關注 ???? 在信息化、數字化、智能化日益發展的今天,大數據技術已經成為推動產業變革的重要引擎。它不僅僅是一個技術工具,更是各行各業創新和優化的核心動力。無論是大企業還是初創公司,大數據的應用已經成為提升效…

[machine learning] Transformer - Attention (二)

本文介紹帶訓練參數的self-attention,即在transformer中使用的self-attention。 首先引入三個可訓練的參數矩陣Wq, Wk, Wv,這三個矩陣用來將詞向量投射(project)到query, key, value三個向量上。下面我們再定義幾個變量: import torch inpu…

施磊老師rpc(三)

文章目錄 mprpc框架項目動態庫編譯框架生成動態庫框架初始化函數-文件讀取1. 為什么要傳入 argc, argv2. 讀取參數邏輯3. 配置文件設計 init部分實現 mprpc配置文件加載(一)配置文件加載類成員變量主要方法**src/include/mprpcconfig.h** 配置文件**bin/test.conf** 實現配置文…

文獻分享:通過簡單的生物偶聯策略將肽雙特異性抗體(pBsAbs)應用于免疫治療

背景 雙特異性抗體是將單克隆抗體的兩個不同抗原結合位點融合成一個單一實體的人工分子。它們已經成為一種很有前景的下一代抗癌治療方法。盡管雙特異性抗體的應用令人著迷,但雙特異性抗體的設計和生產仍然繁瑣而富有挑戰性,導致研發過程漫長&#xff0…

二、shell腳本--變量與數據類型

1. 變量的定義與使用 定義變量:簡單直接 在 Shell 里定義變量相當容易: 基本格式: variable_namevalue關鍵點 ?:賦值號 的兩邊絕對不能有空格!這絕對是初學者最容易踩的坑之一 😨,務必留意&#xff01…

java_Lambda表達式

1、背景 lambda表達式是Java SE 8中一個重要的新特性。lambda表達式允許你通過表達式來代替功能接口。lambda表達式就和方法一樣樣,它提供了一個正常的參數列表和一個使用這些參數的主體(body,可以是一個表達式和一個代碼塊)。La…

給QCustomPlot添加一個QScrollBar滾動條、限制縮放范圍、自動設置大小和右邊欄垂直縮放

實現效果 實現思路 從QCustomPlot類派生一個類,進行個性化設置,在軸矩形的上邊設置Margin,放一個滾動條,設置滾動條的樣式 常量定義 #define NQSCRB 1000構造函數初始化 // 設置QScrollBar的樣式// 頂部空--5,左側空--6

實驗-組合電路設計1-全加器和加法器(數字邏輯)

目錄 一、實驗內容 二、實驗步驟 2.1 全加器的設計 2.2 加法器的設計 三、調試過程 3.1 全加器調試過程 2.加法器的調試過程 四、實驗使用環境 五、實驗小結和思考 一、實驗內容 a) 介紹 在這次實驗中,你將熟悉 Logisim 的操作流程,并且學習…

Linux進程控制與替換詳解

進程創建 fork函數初識 在linux中fork函數是非常重要的函數,它從已存在進程中創建?個新進程。新進程為子進程,而原進程為父進程。 進程調用fork,當控制轉移到內核中的fork代碼后,內核做: ? 分配新的內存塊和內核數據結構給子進程 ? 將父進程部分數據結構內容拷貝至…

Vue3學習筆記2——路由守衛

路由守衛 全局 router.beforeEach((to, from, next) > {})router.afterEach((to, from, next) > {}) 組件內守衛 beforeRouteEnter((to, from, next) > {})beforeRouteUpdate((to, from, next) > {})beforeRouteLeave((to, from, next) > {}) 路由獨享 be…

AI與無人零售:如何通過智能化技術提升消費者體驗和運營效率?

引言:無人零售不只是無人值守 你走進一家無人便利店,沒有迎賓、沒有收銀員,甚至沒有一個人在場,但你剛拿起商品,貨架旁的攝像頭就悄悄“看懂”了你的動作,系統已經在后臺為你記賬。你以為只是沒人管&#x…

如何在3dMax中使用UVW展開修改器?

UVW展開(Unwrap UVW)修改器是3dmax中的一個強大工具,允許對紋理如何應用于3D模型進行精確控制。 與更簡單的UVW Map修改器不同,Unwrap UVW修改器提供了高級選項,用于手動編輯紋理映射,對于詳細和復雜的模型來說是必不可少的。 在本文中,我們將探討增強您對Unwrap UVW修…

【Linux】進程優先級與進程切換理解

🌟🌟作者主頁:ephemerals__ 🌟🌟所屬專欄:Linux 目錄 前言 一、進程優先級 1. 什么是進程優先級 2. 為什么有進程優先級 3. 進程優先級的作用 4. Linux進程優先級的本質 5. 修改進程優先級 二、進…