synchronized 做了哪些優化?

Java 中的 synchronized 關鍵字是保證線程安全的基本機制,隨著 JVM 的發展,它經歷了多次優化以提高性能。

1. 鎖升級機制(鎖膨脹)

JDK 1.6 引入了偏向鎖→輕量級鎖→重量級鎖的升級機制,避免了一開始就使用重量級鎖:

1.1 偏向鎖(Biased Locking)

  • 優化場景:只有一個線程訪問同步塊
  • 實現:在對象頭記錄偏向線程ID
  • 優勢:幾乎無同步開銷
  • 觸發升級:當有其他線程嘗試獲取鎖時

1.2 輕量級鎖(Thin Lock)

  • 優化場景:多線程交替訪問但無競爭
  • 實現:通過CAS操作和棧幀中的Lock Record實現
  • 優勢:避免操作系統層面的線程阻塞
  • 觸發升級:當自旋獲取鎖失敗(默認自旋10次)

1.3 重量級鎖(Heavyweight Lock)

  • 場景:真正的高競爭情況
  • 實現:通過操作系統的互斥量(mutex)實現
  • 特點:線程會進入阻塞狀態

2. 自適應自旋鎖(Adaptive Spinning)

  • 自旋次數不再固定,而是根據:
    • 前一次在該鎖上的自旋成功情況
    • 鎖擁有者的狀態
  • 如果上次自旋成功,則增加自旋次數
  • 如果很少成功,則可能直接跳過自旋

3. 鎖消除(Lock Elimination)

  • 優化場景:JIT 編譯器通過逃逸分析確定對象不會逃逸當前線程
  • 效果:完全移除不必要的同步操作
  • 示例
    public void method() {Object lock = new Object();  // 局部對象,不會逃逸synchronized(lock) {         // 會被優化掉// do something}
    }
    

4. 鎖粗化(Lock Coarsening)

  • 優化場景:相鄰的同步塊使用同一個鎖
  • 效果:合并多個同步塊為一個,減少鎖的獲取/釋放次數
  • 示例
    // 優化前
    synchronized(lock) { do1(); }
    synchronized(lock) { do2(); }// 優化后
    synchronized(lock) { do1();do2(); 
    }
    

5. 其他優化

5.1 偏向鎖延遲啟用

  • 默認情況下,JVM 在啟動后4秒才啟用偏向鎖(通過 BiasedLockingStartupDelay 參數配置)
  • 避免啟動階段大量競爭導致的偏向鎖撤銷開銷

5.2 批量重偏向(Bulk Rebias)

  • 當一類鎖對象被多個線程交替使用,但未真正競爭時
  • JVM 會批量重置這些對象的偏向鎖,而不是逐個撤銷

5.3 批量撤銷(Bulk Revoke)

  • 當一類鎖對象的偏向模式不再有效時
  • JVM 會一次性撤銷所有該類實例的偏向鎖

性能對比(JDK 1.6+ vs 早期版本)

場景早期版本JDK 1.6+ 優化后
單線程訪問重量級鎖開銷偏向鎖零開銷
低競爭交替訪問重量級鎖開銷輕量級鎖CAS操作
短時間高競爭線程立即阻塞自旋嘗試獲取
長時間高競爭線程阻塞最終仍會阻塞

最佳實踐

  1. 減少同步范圍:只在必要代碼塊加鎖
  2. 降低鎖粒度:使用多個細粒度鎖而非一個大鎖
  3. 避免鎖嵌套:容易導致死鎖
  4. 考慮替代方案:在適當場景使用 java.util.concurrent 包中的并發工具

這些優化使得 synchronized 在大多數場景下的性能已經接近或超過顯式鎖(如 ReentrantLock),同時保持了更好的安全性和易用性。

你想要的面試技術資料我全都有:https://pan.q刪掉漢子uark.cn/s/aa7f2473c65b

在這里插入圖片描述

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

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

相關文章

三甲醫院AI醫療樣本數據集分類與收集全流程節點分析(下)

3.3 典型案例分析 —— 以某三甲醫院為例 為了更深入地了解三甲醫院 AI 醫療樣本數據收集的實際情況,本研究選取了具有代表性的某三甲醫院作為案例進行詳細分析。該醫院作為區域醫療中心,在醫療技術、設備和人才方面具有顯著優勢,同時在醫療信息化建設和 AI 應用方面也進行…

設置程序開機自動啟動

在Windows系統中,有幾種方法可以將程序設置為開機自動啟動。下面我將介紹最常用的三種方法,并提供一個C#實現示例。 方法一:使用啟動文件夾(最簡單) 按下 Win R 鍵打開運行對話框 輸入 shell:startup 并回車 將你的…

多源異構數據接入與實時分析:衡石科技的技術突破

在數字化轉型的浪潮中,企業每天產生的數據量呈指數級增長。這些數據來自CRM系統、IoT設備、日志文件、社交媒體、交易平臺等眾多源頭,格式各異、結構混亂、流速不一。傳統的數據處理方式如同在無數孤立的島嶼間劃著小船傳遞信息,效率低下且無…

JVM——Synchronized:同步鎖的原理及應用

引入 在多線程編程的世界里,共享資源的訪問控制就像一場精心設計的交通管制,而Synchronized作為Java并發編程的基礎同步機制,扮演著"交通警察"的關鍵角色。 并發編程的核心矛盾 當多個線程同時訪問共享資源時,"…

跟著AI學習C# Day26

📅 Day 26:C# 異步編程進階 ? 學習目標: 深入理解 async/await 的底層機制;掌握 ConfigureAwait(false) 的作用與使用場景;避免異步死鎖,理解同步上下文(Synchronization Context&#xff09…

Scrapy | 通過爬取豆瓣Top250電影信息來學習在中間件中應用隨機請求頭和代理ip

中間件的使用 1.scrapyl中間件的分類和作用1.1 scrapy中間件的分類1.2 scrapy中間的作用:預處理request和response對象2.下載中間件的使用方法:3.定義實現隨機User-Agent的下載中間件3.1 實戰:爬取豆瓣Top250電影信息3.2 中間件使用實現隨機User-Agent4. 代理ip的使用4.1思路…

【深度學習】深度學習入門:從理論到實踐的全面指南

深度學習入門:從理論到實踐的全面指南 深度學習:開啟人工智能新時代的鑰匙一、深度學習的廣泛應用場景1.1 改變生活的深度學習應用1.2 行業變革案例深度解析案例一:深度學習檢測皮膚癌案例二:移動端OCR技術突破案例三:…

MySQL 數據庫操作完整指南

MySQL 數據庫操作完整指南 目錄 創建數據庫 連接數據庫 創建表 約束詳解 插入數據 查詢數據 多表聯合查詢 連接查詢 高級查詢 更新數據 刪除數據 視圖詳解 存儲過程詳解 函數詳解 觸發器 事務處理 索引優化 安全性管理 備份和恢復 性能優化 刪除表和數據庫 1. 創建數據庫 基…

Java面試復習:面向對象編程、Java 8新特性與Spring

Java面試復習:面向對象編程、Java 8新特性與Spring 面向對象編程 概念解析:面向對象編程(OOP)是將現實世界中的概念抽象為軟件模型的編程范式,包括封裝、繼承和多態。 核心原理: 封裝:通過訪…

藍牙數據通訊,實現內網電腦訪問外網電腦

最近突然想到了一個可以繞開單位安全管控軟件,讓單位內部辦公電腦連上外網的方法。大概是這個樣子,讓單位辦公電腦與自己的外網電腦進行藍牙配對,然后用配對成功的藍牙進行網絡數據交互。這里大家可能會想用一下藍牙的網絡共享功能&#xff0…

硬件面經-具身機器人通用技術要求

目錄 簡介 場景 技術面試 設計知識點 總結 簡介 最近機器人特別的火。所以收集了一些關于機器人的面試及要求 場景 目前具身機器人賽道可謂是十分火熱,全國大大小小崛起了幾十家具身機器人公司,國外比較出名的有波士頓動力,特斯拉等,國內目前比較火的就是宇樹,眾擎…

DeepSeek生成HTML5圖片拼接工具

讓DeepSeek生成一個HTML5圖片拼接工具,給的提示詞如下 提示詞(prompt) 幫我生成一個可以將兩張圖片拼接到一起的程序 支持橫向拼接和豎向拼接,可以用html5實現功能嗎? DeepSeek大概20秒左右就做好了,而且像這么簡單的功能的話也沒…

Java面試復習指南:Java基礎、面向對象編程與并發編程

Java面試復習指南:Java基礎、面向對象編程與并發編程 1. Java基礎 概念解析: Java是一種面向對象的編程語言,具有跨平臺的特性。 核心原理: JVM負責Java程序的跨平臺運行,通過字節碼來實現。 高頻面試問題: Java如何實現跨平臺&#xff…

LeeCode2566替換一個數字后的最大差值

項目場景: 給你一個整數 num 。你知道 Danny Mittal 會偷偷將 0 到 9 中的一個數字 替換 成另一個數字。 請你返回將 num 中 恰好一個 數字進行替換后,得到的最大值和最小值的差為多少。 注意: 當 Danny 將一個數字 d1 替換成另一個數字 …

李宏毅2025《機器學習》第三講-AI的腦科學

在之前的課程中探討了如何利用大模型構建AI Agent,本科將暫時放下應用層面的探索,拿起“手術刀”和“顯微鏡”,深入剖析LLM的“大腦”,帶您踏上一場“AI腦神經科學”的旅程。課程不討論模型的訓練過程,而是假設我們擁有一個已經訓練好的、功能完備的LLM。我們的目標是:理…

CVPR 2025 | 微米級光影CT精度!復旦騰訊優圖開源Real-IAD D3數據集

【導讀】 本文介紹了復旦聯合騰訊優圖發布高精度多模態數據集Real-IAD D,并基于此數據集提出了一種創新的多模態融合檢測方法,數據集已被CVPR 2025收錄,并開源。>>更多資訊可加入CV技術群獲取了解哦~ 目錄 一、Real-IAD D的創新之處…

解決mysql左連接加where就不會保留左表中的全部數據的問題

在SQL中使用MySQL的LEFT JOIN操作時,如果加入了WHERE條件,確實會影響結果集的完整性,特別是如果你在WHERE條件中使用了JOIN的另一張表中的字段作為過濾條件。這是因為當你在WHERE子句中加入了對JOIN另一張表的過濾條件時,實際上你是在執行一個INNER JOIN(內連接)而非LEFT…

算法與數據結構:動態規劃DP

文章目錄 動態規劃算法全面解析一、核心思想與基本概念二、動態規劃與其他算法的區別三、動態規劃的解題步驟四、經典案例解析1. **斐波那契數列(Fibonacci)**2. **0-1背包問題(0-1 Knapsack)**3. **最長公共子序列(LC…

Coilcraft電感上的橫線是什么意思?電感有方向么?

通常我們會認為電容、電感、電阻這幾類無源器件沒有方向性,在布局和貼片時可以任意方向放置,也不會在PCB上增加絲印標識說明其方向。與此相互印證的是,電容表面無絲印,無法識別方向;電阻表面一般只有包含阻值大小的數字…

通過Docker掛載nginx并修改頁面

1:通過docker創建nginx: 首先關閉原來的Docker(防止端口號沖突) sudo nginx -s stop 直接啟動 Nginx 進程 sudo nginx 啟動nginx: docker run -di --namemynginx -p 80:80 nginx cd /etc/nginx docker run -d …