【Synchronized同步原理】

Synchronized同步原理

  • 1. synchronized的使用?
  • 2. 如何保證線程安全的?
  • 3.可重入原理(加鎖次數計數器)
  • 4. 原子性和可見性(順序性)

1. synchronized的使用?

  • 對象鎖
  • 方法鎖
  • 類鎖

2. 如何保證線程安全的?

public class SynchronizedDemo2 {Object object = new Object();public void method1() {synchronized (object) {}}
}

執行javac SynchronizedDemo2.java, javap -verbose SynchronizedDemo2.class

在這里插入圖片描述

下圖表現了對象,對象監視器,同步隊列以及執行線程狀態之間的關系:

在這里插入圖片描述
該圖可以看出,任意線程對Object的訪問,首先要獲得Object的監視器,如果獲取失敗,該線程就進入同步狀態,線程狀態變為BLOCKED,當Object的監視器占有者釋放后,在同步隊列中得線程就會有機會重新獲取該監視器。

3.可重入原理(加鎖次數計數器)

public class SynchronizedDemo {public static void main(String[] args) {synchronized (SynchronizedDemo.class) {}method2();}private synchronized static void method2() {}
}
 public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: (0x0009) ACC_PUBLIC, ACC_STATICCode:stack=2, locals=3, args_size=10: ldc           #2                  // class tech/pdai/test/synchronized/SynchronizedDemo2: dup3: astore_14: monitorenter5: aload_16: monitorexit7: goto          1510: astore_211: aload_112: monitorexit13: aload_215: invokestatic  #3                  // Method method2:()VException table:from    to  target type5     7    10   any10    13    10   any

Synchronized先天具有重入性。每個對象擁有一個計數器,當線程獲取該對象鎖后,計數器就會加一,釋放鎖后就會將計數器減一。

4. 原子性和可見性(順序性)

  • 保證可見性的原理:內存模型和happens-before規則
  • Synchronized的happens-before規則,即監視器鎖規則:對同一個監視器的解鎖,happens-before于對該監視器的加鎖。繼續來看代碼:
public class MonitorDemo {private int a = 0;public synchronized void writer() {     // 1a++;                                // 2}                                       // 3public synchronized void reader() {    // 4int i = a;                         // 5}                                      // 6
}

該代碼的happens-before關系如圖所示:
在這里插入圖片描述在圖中每一個箭頭連接的兩個節點就代表之間的happens-before關系,黑色的是通過程序順序規則推導出來,紅色的為監視器鎖規則推導而出:

線程A釋放鎖happens-before線程B加鎖,藍色的則是通過程序順序規則和監視器鎖規則推>測出來happens-befor關系,通過傳遞性規則進一步推導的happens-before關系。現在我們來重點關注2 happens-before 5,通過這個關系我們可以得出什么?根據happens-before的定義中的一條:如果A happens-before B,則A的執行結果對B可見,并且A的執行順序先于B。線程A先對共享變量A進行加一,由2 happens-before 5關系可知線程A的執行結果對線程B可見即線程B所讀取到的a的值為1。

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

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

相關文章

關于數據提交上傳服務端的數據類型以及項目打包上線的流程

1 請求頭的類型: content-type; 01: application/json 數據以json格式請求:{"key":"value"} 02: application/x-www.form-urlencoded from表單的數據格式 name"zs"&age12 03 mutipart/form-data…

重學SpringBoot3-自動配置機制

重學SpringBoot3-自動配置機制 引言Spring Boot 自動配置原理示例:Spring Boot Web 自動配置深入理解總結相關閱讀 引言 Spring Boot 的自動配置是其最強大的特性之一,它允許開發者通過最少的配置實現應用程序的快速開發和部署。這一切都得益于 Spring …

飛槳(PaddlePaddle)模型保存與加載教程

文章目錄 飛槳(PaddlePaddle)模型保存與加載教程1. 概述2. 訓練調優場景2.1 保存動態圖模型2.2 加載動態圖模型 3. 推理部署場景3.1 使用基礎API 4. 其他場景4.1 舊版本格式兼容載入4.2 靜態圖模型的保存與加載 5. 總結 飛槳(PaddlePaddle&am…

OmniPlan Pro mac版:簡單、智能,項目管理新選擇!

OmniPlan Pro是一款功能強大的項目管理軟件,它以其直觀的用戶界面和豐富的功能,幫助用戶輕松管理各種復雜的項目。無論是個人任務還是團隊協作,OmniPlan Pro都能提供全面的解決方案,讓項目管理變得更加簡單高效。 OmniPlan Pro軟…

從0開始回顧Mysql --- MySQL初體驗

大白話從0開始回顧MySQL,去除了一些繁瑣的操作的演示以及內容,如MySQL安裝等,本篇文章適合復習MySQL語法,學習MySQL語句,對MySQL不太熟練的同學,希望對大家有一些幫助。 MySQL初體驗 首先,我將…

如何在Window系統部署VisualSVN服務并結合cpolar實現無公網ip遠程訪問

文章目錄 前言1. VisualSVN安裝與配置2. VisualSVN Server管理界面配置3. 安裝cpolar內網穿透3.1 注冊賬號3.2 下載cpolar客戶端3.3 登錄cpolar web ui管理界面3.4 創建公網地址 4. 固定公網地址訪問 前言 SVN 是 subversion 的縮寫,是一個開放源代碼的版本控制系統…

數字孿生與智慧交通的融合發展:推動交通行業數字化轉型,構建智慧城市新生態

隨著信息技術的快速發展和城市化進程的深入推進,交通行業正面臨著前所未有的機遇與挑戰。傳統的交通管理模式已難以滿足日益增長的交通需求,而數字化轉型則成為了推動交通行業創新發展的必由之路。數字孿生技術作為一種前沿的信息技術手段,為…

聊一聊腦機接口

截至我所知的信息,腦機接口(Brain-Computer Interface, BCI)技術正在迅速發展,但仍處于相對早期階段。這一領域的研究涉及神經科學、工程學、計算機科學和人工智能等多個學科。以下是一些關于腦機接口目前進展的要點: …

基于springboot+vue的公寓報修管理系統

博主主頁:貓頭鷹源碼 博主簡介:Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰,歡迎高校老師\講師\同行交流合作 ?主要內容:畢業設計(Javaweb項目|小程序|Pyt…

每天的三哥牌小雞腿沒了

查看印度基金(164824)公告,從2024年2月28日起,暫停印度基金的申購,限額100塊的一拖七套利告一段落。這意味著看好印度股市的國內投資者,以后只能通過在場內買入獲得份額。 關于暫停申購的原因,官方說是為保護基金持有…

學Python如此簡單--停車管理模塊

簡介 (本停車場一個小時4塊) 模塊名稱:黑心停車管理模塊 模塊功能:汽車進場錄入、汽車出場收費 代碼 #進入停車場 def enter():print(歡迎進入黑心停車場)#模擬識別車牌號car_number input(請輸入車牌號:)t 0 #停車時間car…

重磅!交通領域頂級會議TRB會議將進行重大改革

美國交通研究委員會年會(Transportation Research Board annual meeting,以下簡稱TRB會議)是由美國交通研究委員會舉辦的交通領域的國際頂級會議。該會議每年舉辦一次,在華盛頓特區召開。TRB會議是交通研究領域知名度最高的學術會議之一&…

安裝 node 錯誤的配置環境變量之后使用 npm 報錯

安裝 node 錯誤的配置環境變量之后使用 npm 報錯 node:internal/modules/cjs/loader:1147 throw err; ^ Error: Cannot find module ‘F:\ACodeTools\Node\node_modules\npm\bin\node_modules\npm\bin\npm-cli.js’ at Module._resolveFilename (node:internal/modules/cjs/loa…

基于springboot實現企業員工績效考評系統項目【項目源碼+論文說明】

基于springboot實現企業員工績效考評系統演示 摘要 時代的變化速度實在超出人類的所料,21世紀,計算機已經發展到各行各業,各個地區,它的載體媒介-計算機,大眾稱之為的電腦,是一種特高速的科學儀器&#xf…

AI-數學-高中-32-統計-樣本空間與隨機事件

原作者視頻:【概率】【一數辭典】1樣本空間與隨機事件_嗶哩嗶哩_bilibili 1.隨機試驗: 2.樣本點、樣本空間、有限樣本空間: 示例1 示例2 3.事件: 示例:

[DEBUG] spring boot-如何處理鏈接中的空格等特殊字符

問題&#xff1a; get或者post中提交的內容可能有空格、#等特殊字符&#xff0c;不做處理的話可能解析錯誤。 解決&#xff1a; html中&#xff1a; <a th:href"{/listSgrna(id${item.getGeneId()},geneName${item.getGeneName()},genome${genome},sgrnaNum${sgrnaN…

Qt CMake 國際化相關配置

文章目錄 更新ts文件發布ts文件 本來用qmake使用pro文件很簡單的一件事&#xff0c;結果用cmake折騰了半天。 何必呢~ 參考&#xff1a;QT6.3 CMake 多語言切換 這是我的 cmake_minimum_required(VERSION 3.16)project(testQml3_6 VERSION 0.1 LANGUAGES CXX)set(CMAKE_AUTO…

06.QT信號和槽-1

一、信號和槽概述 在Qt中&#xff0c;用戶和控件的每次交互過程稱為一個事件。比如"用戶點擊按鈕"是一個事件&#xff0c;"用戶關閉窗口"也是一個事件。每個事件都會發出一個信號&#xff0c;例如用戶點擊按鈕會發出"按鈕被點擊"的信號&#xff…

Java練習(第5天)【總結】在字符串中尋找特定的字符(5種方法)

問題描述&#xff1a;在字符串中尋找特定字符 1、第1次出現位置 實現函數原型&#xff1a; int indexOf(char c) Java代碼&#xff1a; import java.io.*; public class Way_1 {public static void main(String args[]){String str "Geeks for Geeks is a computer s…

疲勞駕駛監測報警攝像機

疲勞駕駛是導致交通事故的重要原因之一&#xff0c;為了提高駕駛安全性&#xff0c;科技日新月異&#xff0c;疲勞駕駛監測報警攝像機因其先進的技術而成為關注焦點。 疲勞駕駛監測報警攝像機采用先進的人臉識別技術和人工智能算法&#xff0c;能夠實時監測駕駛員的狀態。通過對…