【JavaEE】_synchronized關鍵字——監視器鎖monitor lock

目錄

1. synchronized的特性

2. synchronized的使用

3. Java標準庫中的線程安全類


1. synchronized的特性

(1)互斥:

前文已經介紹,某個線程執行到某個對象的synchronized中時,其他線程如果也執行到同一個對象,synchronized就會阻塞等待,進入synchronized修飾的代碼塊相當于加鎖,退出synchronized修飾的代碼塊相當于解鎖;

(2)刷新內存:

前文介紹內存可見性時已經提到:synchronized的工作過程是:

① 獲得互斥鎖,② 從內存拷貝變量的最新內存到寄存器,③ 執行代碼,

④ 將更改后的共享變量的值刷新到寄存器,⑤ 釋放互斥鎖;

故而synchronized也可以保證內存的可見性;

(3)可重入:

同一個線程針對同一個鎖連續加兩次,如果出現了死鎖就是不可重入,不會死鎖就是可重入;

(3.1)死鎖:

class Counter{public int count=0;synchronized public void increase(){synchronized (this){count++;}}
}

外層先加了一次鎖,內層又對同一對象再次加鎖,此時由于外層鎖需要執行完內部代碼才能解鎖,而內層鎖需要等待已經先鎖的外層鎖解鎖后才能執行,此時就會形成死鎖;

(3.2)可重入鎖:

為了解決這個問題,JVM內部將synchronized實現為可重入鎖。

可重入鎖會記錄當前占用鎖的線程以及加鎖次數,線程a第一次加鎖成功后,鎖內部就會記錄當前占用鎖的線程為a,同時加鎖次數為1,后續線程a再加鎖時,進行的加鎖操作就非真實的加鎖操作而是一個偽加鎖,是沒有實質影響的,只是將加鎖次數增加為2;

代碼執行完畢解鎖時,會將計數-1,當鎖的計數減到0時,才會真的解鎖;

可重入鎖降低了程序員的編寫負擔,降低了使用成本,提高了開發效率,但同時由于需要維護鎖所屬的線程以及加減計數會降低運行效率,程序的開銷也會更大;

(3.3)死鎖的必要條件:

① 互斥使用:一個鎖被一個線程占用后,其他線程就無法占用;

② 不可搶占:一個鎖被一個線程占用后,其他線程不能搶占該鎖;

③ 請求與保持:當一個線程占據了多把鎖之后除非顯式釋放鎖,否則這些鎖始終被該線程持有;

(以上三條都是鎖本身的特點)

④ 環路等待:等待關系成環;

在實際開發中需要避免死鎖,關鍵還是從避免環路等待入手:

針對多把鎖加鎖時約定好固定的順序,就可以避免等待關系成環;

但實際情況中很少出現一個線程套鎖的問題;

2. synchronized的使用

使用synchronized的本質是修改了Object對象中“對象頭”內的一個標記;

(1)直接修飾普通方法:此時鎖對象是this:

class Counter{public int count=0;synchronized public void increase(){count++;}
}

?當兩個線程同時對同一個對象進行加鎖的時候才存在競爭;

(2)修飾一個代碼塊:需要顯式指定鎖對象:

class Counter{public int count=0;public void increase(){synchronized (this){count++;}}}
public class Demo1 {private static Counter counter = new Counter();public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{for(int i=0;i<50000;i++){counter.increase();}});Thread t2 = new Thread(()->{for(int i=0;i<50000;i++){counter.increase();}});t1.start();t2.start();t1.join();t2.join();System.out.println(counter.count);}
}

counter.increase()表示針對this對象進行加鎖操作;

注:任何對象都可以進行加鎖是java語言的特色;

(3)修飾一個靜態方法:

靜態方法其實就是類方法,普通方法就是實例方法;故而

synchronized修飾一個靜態方法就相當于針對當前類的類對象加鎖

class Counter{synchronized public static void func1(){}public static void fun2(){synchronized (Counter.class){}}
}

如在上文代碼中,靜態方法func1是表示為synchronized修飾的靜態方法,其效果等效于靜態方法func2;

注:(1)類對象就是運行程序時.class文件被加載到JVM內存中時的形態;

(2)使用synchronized很容易造成線程阻塞,一旦線程阻塞,此時放棄CPU,再次回到CPU的時間就不可控了,一旦代碼中使用了synchronized,則“高性能”幾乎無法實現;

3. Java標準庫中的線程安全類

Java標準庫中已經實現的類中有些是線程安全的,有些是線程不安全的:

線程不安全類:

①ArrayList ②LinkedList ③HashMap ④TreeMap ⑤HashSet ⑥TreeSet ⑦StringBuilder

線程安全類:

①Vector(不推薦) ②HashTable(不推薦)③ConcurrentHashMap ④StringBuffer ⑤String

注:(1)線程安全類由于一些關鍵方法都被synchronized修飾,保證了多線程環境下修改同一個對象不會出現線程不安全問題;

(2)String是線程安全類不是因為synchronized修飾,而是因為String是不可變對象,不存在多線程中修改造成的線程不安全問題;

同時請注意不可變對象與常量以及final沒有必然聯系:

不可變對象是指在該類中沒有提供public的修改屬性的方法,final修飾類表示類不可繼承;

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

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

相關文章

2024 Sora來了!“手機Agent智能體”也來了!

近日&#xff0c;Open AI發布了能夠根據文本生成超現實視頻的工具Sora&#xff0c;多款震撼視頻引爆科技圈刷屏&#xff0c;熱度持續發酵占據AI領域話題中心&#xff0c;被認為是AGI實現過程里的重大里程碑事件。新一輪的人工智能浪潮給人類未來的生產和生活方式帶來巨大而深遠…

VPN | 世界那么大,我想“魔法”上網看看,可以嗎?

Hi&#xff0c;大家好&#xff0c;我是半畝花海。世界那么大&#xff0c;我想“魔法”上網看看&#xff0c;可以嗎&#xff1f;隨著網絡的發展與普及&#xff0c;暢游網絡世界已成為人們生活的一部分。它給我們開拓了視野&#xff0c;增長了見聞&#xff0c;豐富了知識&#xf…

FISCO BCOS(二)———配置及使用控制臺

一、前言 FISCO BCOS是由金融區塊鏈合作聯盟&#xff08;深圳&#xff09;與微眾銀行共同發起的開源區塊鏈項目&#xff0c;支持多鏈多賬本&#xff0c;滿足金融行業復雜業務需求。本文將介紹如何在Ubuntu操作系統上使用Linux命令配置FISCO BCOS的控制臺并進行get/set操作。 目…

React 模態框的設計(一)拖動組件的設計

春節終結束了&#xff0c;忙得我頭疼。終于有時間弄自己的東西了。今天來寫一個關于拖動的實例講解。先看效果&#xff1a; 這是一個簡單的組件設計&#xff0c;如果用原生的js設計就很簡單&#xff0c;但在React中有些事件必須要多考慮一些。這是一個系列的文章&#xff0c;…

SpringBoot3整合elasticsearch8

版本 SpringBoot 3.0 Elasticsearch 8.12.1 依賴 我使用的 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> 還可以用&#xff0c;但我沒用…

YOLOv9來咧!

文章目錄 論文:主要內容一、提出使用PGI&#xff08;Programmable Gradient Information&#xff0c;可編程梯度信息&#xff09;來解決信息瓶頸問題和深度監督機制不適合輕量級神經網絡的問題。二、設計了GELAN&#xff08;Generalized ELAN &#xff0c;廣義ELAN&#xff09;…

LLM 模型融合實踐指南:低成本構建高性能語言模型

編者按&#xff1a;隨著大語言模型技術的快速發展&#xff0c;模型融合成為一種低成本但高性能的模型構建新途徑。本文作者 Maxime Labonne 利用 mergekit 庫探索了四種模型融合方法&#xff1a;SLERP、TIES、DARE和passthrough。通過配置示例和案例分析&#xff0c;作者詳細闡…

Ansible playbook 劇本部署WEB NFS rsync sersync(及時監控)架構

ansible playbook劇本介紹&#xff1a; playbook 是ansible用于配置&#xff0c;部署和管理被節點的劇本 由一個或多個模塊組成&#xff0c;完成統一的目的&#xff0c;實現自動化操作 劇本編寫需遵循yaml語法 yaml的三要素&#xff1a; 縮進&#xff1a;兩個字符&#xff0c;默…

【Vue3】toRefs和toRef在reactive中的一些應用

&#x1f497;&#x1f497;&#x1f497;歡迎來到我的博客&#xff0c;你將找到有關如何使用技術解決問題的文章&#xff0c;也會找到某個技術的學習路線。無論你是何種職業&#xff0c;我都希望我的博客對你有所幫助。最后不要忘記訂閱我的博客以獲取最新文章&#xff0c;也歡…

快速上手vue指南

Vue.js 是一款非常流行且易于上手的前端框架&#xff0c;用于構建用戶界面和單頁應用程序&#xff08;SPA&#xff09;。它以其簡潔的API、靈活的組件系統和高效的性能著稱。如果你是初學者&#xff0c;以下是一些關鍵步驟和建議&#xff0c;可以幫助你快速上手 Vue.js。 1. 理…

【Qt】實現 Ctrl + 鼠標滾輪 縮放文本功能

【Qt】實現 Ctrl 鼠標滾輪 縮放文本功能 文章目錄 I - 實現自定義控件II - 完整代碼III - 參考鏈接 I - 實現自定義控件 主要原理 繼承 QTextEdit 或者 QPlainTextEdit 類&#xff0c;重寫滾輪事件 wheelEvent, QTextEdit 和 QPlainTextEdit 中均包含此函數 頭文件 TextEdit…

學習springMVC第二天

REST簡介 REST(Representational State Transfer)&#xff0c;表現形式狀態轉換 傳統風格資源描述形式 http://localhost/user/getById?id1 http://localhost/user/saveUser REST風格描述形式 http://localhost/user/1 http://localhost/user 優點&#xff1a; 隱藏資源的訪問…

C++模板->模板的概念、函數模板基本語法、函數模板注意事項、普通函數與函數模板區別、普通函數與函數模板調用規則、模板的局限性

#include<iostream> using namespace std; //交換兩個整型函數 void swapInt(int& a, int& b) { int temp a; a b; b temp; } //交換兩個浮點型函數 void swapDouble(double& a, double& b) { double temp a; a b; b te…

MATLAB中gtext函數用法

目錄 語法 說明 示例 使用鼠標將文本添加到圖窗 指定字體大小和顏色 在創建后修改文本 gtext函數的功能是使用鼠標將文本添加到圖窗。 語法 gtext(str) gtext(str,Name,Value) t gtext(___) 說明 gtext(str) 在使用鼠標選擇的位置插入文本 str。當將鼠標指針懸停在圖…

Oracle普通用戶啟停JOB報錯ORA 27486權限不足

Oracle普通用戶啟停JOB報錯ORA 27486權限不足 問題與現象原因與對策 問題與現象 應用用戶通過DBMS_SCHEDULER啟停自己的JOB需要的權限&#xff1a; grant execute on dbms_scheduler to appuser;該普通用戶有CREATE JOB的權限。通過DBMS_SCHEDULER停止自己的JOB時&#xff1a…

3個wordpress中文企業主題模板

農業畜牧養殖wordpress主題 簡潔大氣的農業畜牧養殖wordpress主題&#xff0c;農業農村現代化&#xff0c;離不開新農人、新技術。 https://www.jianzhanpress.com/?p3051 老年公寓wordpress主題 淺綠色簡潔實用的老年公寓wordpress主題&#xff0c;適合做養老業務的老年公…

高標準農田儀器設備

在當今社會中&#xff0c;農業已經逐漸走向了一條科技化、智能化的道路。高標準農田建設成為了現代化農業發展的一個重要方向。為了更好地提高農產品的產量和品質&#xff0c;科技人員們不斷地在農田設備上進行創造性的改進與升級&#xff0c;以達到更加高效、節能、環保、智能…

SouthLeetCode-打卡24年02月第3周

SouthLeetCode-打卡24年02月第3周 // Date : 2024/02/12 ~ 202X/02/18 049.反轉字符串 (1) 題目描述 049#LeetCode.344.簡單題目鏈接#Monday2024/02/12 編寫一個函數&#xff0c;其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 s 的形式給出。 不要給另外的數組分…

【C語言】注釋

&#x1f388;個人主頁&#xff1a;豌豆射手^ &#x1f389;歡迎 &#x1f44d;點贊?評論?收藏 &#x1f917;收錄專欄&#xff1a;C語言 &#x1f91d;希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出指正&#xff0c;讓我們共同學習、交流進步&…

計算機網絡--物理層練習題

習題 下列說法正確的是&#xff08;D&#xff09; A 信道與通信電路類似&#xff0c;一條可通信的電路往往包含一個信道 信道不等于通信電路&#xff0c;一條可雙向通信的電路往往包含兩個信道&#xff1a;一個是發送信道&#xff0c;一條是接收信道。另外&#xff0c;多個通…