Synchronized 概述


1. 初識

synchronized 是 Java 中的關鍵字,是一種 同步鎖可重入鎖悲觀鎖。它修飾的對象有以下幾種:
具體表現為以下3種形式。
對于普通同步方法,鎖是當前實例對象。
對于靜態同步方法,鎖是當前類的 Class 對象。
對于同步方法塊,鎖是 synchonized 括號里配置的對象。

雖然可以使用 synchronized 來定義方法,但 synchronized 并不屬于方法定義的一部分,因此,synchronized
關鍵字不能被繼承。 如果在父類中的某個方法使用了 synchronized 關鍵字,而在子類中覆蓋了這個方法,在子類中的這
個方法默認情況下并不是同步的,而必須顯式地在子類的這個方法中加上 synchronized
關鍵字才可以。當然,還可以在子類方法中調用父類中相應的方法,這樣雖然子類中的方法本身不是同步的,但子類調用了父類的同步方法,因此,子類的方法也就相當于同步了。

如果一個代碼塊被 synchronized 修飾了,當一個線程獲取了對應的鎖,并執行該代碼塊時,其他線程便只能一直等待,等待持有鎖的線程釋放鎖,而這里獲取鎖的線程釋放鎖只會有兩種情況

  1. 獲取鎖的線程執行完了該代碼塊,然后線程釋放對鎖的占有;
  2. 線程執行發生異常,此時 JVM 會讓線程自動釋放鎖。

那么如果這個獲取鎖的線程由于要等待 IO 或者其他原因(比如調用 sleep
方法)被阻塞了,但是又沒有釋放鎖,其他線程便只能干巴巴地等待,試想一下,這多么影響程序執行效率。
因此就需要有一種機制可以不讓等待的線程一直無期限地等待下去(比如只等待一定的時間或者能夠響應中斷),通過 Lock 就可以辦到。


2. synchronized 的底層字節碼

synchronized 三種用法及其原理

2.1 同步代碼塊

通過反編譯可以看到, 其實現使用的是 monitorenter 和 monitorexit 指令。

2.2 普通同步方法

在這里插入圖片描述

調用指令將會檢查方法的 ACC_SYNCHRONIZED 訪問標志是否被設置。如果設置了,執行線程會將先持有 monitor 然后再執行方法,最后在方法完成(正常和異常情況都算完成)時釋放 monitor。

2.3 類同步方法

在這里插入圖片描述

ACC_STATIC 和 ACC_SYNCHRONIZED 訪問標志區分該方法是否是靜態同步方法。


3. synchronized 鎖的是什么

synchronized 用的鎖是存在 Java 對象頭里的。

3.1 什么是管程

管程 (英語:Monitors,也稱為監視器) 是一種程序結構,結構內的多個子程序(對象或模塊)形成的多個工作線程互斥訪問共享資源。
這些共享資源一般是硬件設備或一群變量。對共享變量能夠進行的所有操作集中在一個模塊中。(把信號量及其操作原語“封裝”在一個對象內部)管程實現了在一個時間點,最多只有一個線程在執行管程的某個子程序。管程提供了一種機制,管程可以看做一個軟件模塊,它是將共享的變量和對于這些共享變量的操作封裝起來,形成一個具有一定接口的功能模塊,進程可以調用管程來實現進程級別的并發控制。

在這里插入圖片描述

3.2 monitor ObjectMonitor

在 HotSpot 虛擬機中, monitor 采用 ObjectMonitor 實現
ObjectMonitor.java ->> ObjectMonitor.cpp ->> ObjectMonitor.hpp

在這里插入圖片描述

Java 中的每個對象天生都帶著一個對象的監視器(所以 Java 中任何一個對象都可以成為一個鎖)。
任何對象都有一個 monitor 與之關聯,當且一個 monitor 被持有后,它將處于鎖定狀態。線程執行到 被 synchronized 修飾的方法時,將會 嘗試獲取對象頭的 monitor 的所有權,即嘗試獲得對象的鎖。

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

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

相關文章

通過Auth.log來查看VPS服務器是否被掃描和暴力破解及解決辦法

說明:很多人vps可能出現過被掃的情況,有的還被爆破了,這里提供下查看方法 查看用密碼登陸成功的IP地址及次數grep "Accepted password for root" /var/log/auth.log | awk {print $11} | sort | uniq -c | sort -nr | more查看用密…

碰一碰發視頻手機版源碼開發:支持OEM

**從事開發 20 年,見過不少技術風口起起落落,最近 “碰一碰發視頻” 又成了熱門話題。不少同行或剛入行的年輕人來問我,手機版源碼開發該從哪下手,怕踩坑、怕走彎路。今天就以一個老程序員的視角,把碰一碰發視頻手機版…

只出現一次的數字(總結)

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄前言一、給定一個整數數組nums,除了某個元素只出現一次以外,其余元素均出現兩次。找出那個只出現一次的元素二、給你一個整數數組nums&#x…

Cesium 入門教程(十一):Camera相機功能展示

文章目錄一,Cesium 實際示例(含源代碼)1,vuecesium: 圍繞一個固定點自動左右旋轉2,vuecesium: flyto一個具體的實體位置3,vuecesium: flyto一個具體的點位置4&#xff0c…

go語言基本排序算法

package mainimport "fmt"func main() {BubbleSort()SelectSort()InsertSort()MergeSort()QuickSort()HeapSort()ShellSort() }//冒泡排序 func BubbleSort() {str : []int{9, 1, 5, 8, 3, 7, 4, 6, 2}for i : 0; i < len(str)-1; i {flag : falsefor j : len(str…

一步完成CalDAV賬戶同步,日歷服務助力釘釘日歷日程集中管理

在信息爆炸節奏飛快的今天&#xff0c;高效的管理時間已經成為我們工作和生活中的核心競爭力&#xff0c;復雜紛繁的日程安排&#xff0c;無處不在的提醒需求以及跨設備同步的困擾&#xff0c;這些問題仿佛都在呼喚著一個更智能、更便捷、更可靠的解決方案。 而華為日歷App&am…

企業內部機密視頻安全保護|如何防止企業內部機密視頻泄露?

在企業數字化進程飛速發展的今天&#xff0c;視頻內容已成為承載企業內部培訓、戰略會議、產品機密和核心技術的關鍵載體。一次意外的泄露&#xff0c;不僅可能導致知識產權流失&#xff0c;更會讓企業聲譽和市場競爭力遭受重創。面對無孔不入的安全威脅&#xff0c;企業該如何…

C# Deconstruct | 簡化元組與對象的數據提取

官方文檔&#xff1a;析構元組和其他類型 - C# | Microsoft Learn 標簽&#xff1a;Deconstruct、Tuple、record、模式匹配 PS&#xff1a;record相關內容后續還會繼續更新&#x1f504; 模式匹配可以查看我的另一篇&#x1f449;模式匹配 目錄1. 概述2. 基本用法2.1 元組解…

R 語言 ComplexUpset 包實戰:替代 Venn 圖的高級集合可視化方案

摘要 在生物信息學、數據挖掘等領域的集合分析中,傳統 Venn 圖在多維度數據展示時存在信息擁擠、可讀性差等問題。本文基于 R 語言的 ComplexUpset 包,以基因表達研究為場景,從包安裝、數據準備到可視化實現,完整演示如何制作正刊級別的集合交集圖,解決多條件下差異基因(…

?導游|基于SprinBoot+vue的在線預約導游系統

在線預約導游系統 基于SprinBootvue的在線預約導游系統 一、前言 二、系統設計 三、系統功能設計 前臺功能實現 后臺功能實現 管理員模塊實現 導游模塊實現 用戶模塊實現 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取&am…

SQL server 異常 出現錯誤 824

2025-08-27 01:36:37,324 ERROR c.z.i.w.DatabaseUtils [Scheduled-7] Error executeStoredProcedure SQL script: sp_RefreshDWDByDateFive警告: 在 08 27 2025 1:36AM 出現錯誤 824。請記錄該錯誤和時間&#xff0c;并與您的系統管理員聯系。 2025-08-27 01:36:37,332 ERROR …

制造業生產線連貫性動作識別系統開發

制造業生產線連貫性動作識別系統開發 第一部分&#xff1a;項目概述與理論基礎 1.1 項目背景與意義 在現代智能制造環境中&#xff0c;盡管自動化程度不斷提高&#xff0c;但人工操作仍然在復雜裝配任務中扮演著不可替代的角色。研究表明&#xff0c;人機協作被視為打破傳統人機…

什么是Jmeter? Jmeter工作原理是什么?

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 第一篇 什么是 JMeter&#xff1f;JMeter 工作原理 1.1 什么是 JMeter Apache JMeter 是 Apache 組織開發的基于 Java 的壓力測試工具。用于對軟件做壓力測試&a…

Linux網絡基礎1(一)之計算機網絡背景

文章目錄計算機網絡背景網絡發展認識 "協議"高小琴例子方言例子計算機網絡背景 網絡發展 獨立模式: 計算機之間相互獨立; 網絡互聯: 多臺計算機連接在一起, 完成數據共享; 局域網LAN: 計算機數量更多了, 通過交換機和路由器連接在一起; 廣域網WAN: 將遠隔千里的計算…

如何在數學建模賽中實現模型創新?

模型創新性在國賽數學建模中&#xff0c;完備性是論文的基本要求&#xff0c;而創新性則是決定論文能否脫穎而出的關鍵因素。所謂創新&#xff0c;并不僅僅指提出完全新穎的數學理論&#xff0c;而是能夠在已有方法的基礎上&#xff0c;通過新的問題切入點、假設修正、模型優化…

【重磅發布】flutter_chen_updater-版本升級更新

Flutter Chen Updater 一個功能強大的Flutter應用內更新插件&#xff0c;支持Android APK自動下載、安裝和iOS跳轉App Store。 ? 特性 ? 跨平臺支持: Android APK自動更新&#xff0c;iOS跳轉App Store? 智能下載: 支持斷點續傳、文件校驗、多重備用方案? 權限管理: 自動處…

docker 1分鐘 快速搭建 redis 哨兵集群

使用 docker-compose 1 分鐘搭建好 1主2從3哨兵的 redis 哨兵集群 目錄結構 redis-sentinel-cluster ├── check_redis.sh ├── docker-compose.yml ├── redis │ └── redis.conf ├── sentinel │ └── sentinel.confdocker-compose.yml 配置 version: 3…

Git與DevOps實戰:從版本控制到自動化部署

一、版本控制1.什么是版本控制&#xff1f;版本控制用于高效追蹤和管理項目開發中的代碼、配置及文檔變更歷史&#xff0c;確保團隊成員始終使用正確版本&#xff0c;并支持版本回溯、差異比較和文件恢復。它能帶來以下優勢&#xff1a;通過歷史記錄保障數據安全與完整性&#…

大模型——利用RAG構建智能問答平臺實戰

利用RAG構建智能問答平臺實戰 目前公司的智能問答平臺利用RAG技術構建,現給大家分享下通RAG技術構建智能問平臺的具體流程和原理。 一、什么是RAG RAG是檢索增強生成技術(Retrieval-Augmented Generation),目前是構建智能問答的重要技術。RAG相比傳統的檢索可以可以減少…

flume事務機制詳解:保障數據可靠性的核心邏輯

flume事務機制詳解&#xff1a;保障數據可靠性的核心邏輯 在數據采集過程中&#xff0c;“不丟數據、不重數據” 是核心需求。Flume 之所以能在分布式環境下保證數據可靠性&#xff0c;關鍵在于其內置的事務機制。Flume 通過在 “Source → Channel” 和 “Channel → Sink” …