日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JAVAsynchronized原理詳解

瀏覽:31日期:2023-12-14 10:49:26
目錄1、synchronized的作用2、synchronized的語法3、Monitor原理4、synchronized的原理4.1偏向鎖4.2輕量級鎖4.3鎖膨脹4.4重量級鎖4.5自旋鎖4.6鎖消除4.7鎖粗化5、鎖升級過程總結1、synchronized的作用

為了避免臨界區的競態條件發生,有多種手段可以達到目的。

阻塞式的解決方案:synchronized,Lock 非阻塞式的解決方案:原子變量

synchronized,即俗稱的【對象鎖】,它采用互斥的方式讓同一時刻至多只有一個線程能持有【對象鎖】,其它線程再想獲取這個【對象鎖】時就會阻塞住。這樣就能保證擁有鎖的線程可以安全的執行臨界區內的代碼,不用擔心線程上下文切換。

synchronized的三個作用

原子性:確保線程互斥的訪問同步代碼 可見性:保證共享變量的修改能夠及時可見 有序性:有效解決重排序問題2、synchronized的語法

class Test1{ public synchronized void test() { }}//等價于class Test1{ public void test() {//鎖的是當前對象synchronized(this) {} }}

class Test2{ public synchronized static void test() { }}//等價于class Test2{ public static void test() {//鎖的是類對象,類對象只有一個synchronized(Test2.class) {} }}3、Monitor原理

Monitor 被翻譯為監視器或管程

每個 Java 對象都可以關聯一個 Monitor 對象,如果使用 synchronized 給對象上鎖(重量級)之后,該對象頭的 Mark Word 中就被設置指向 Monitor 對象的指針

Monitor 結構如下

JAVAsynchronized原理詳解

剛開始 Monitor 中 Owner 為 null 當 Thread-2 執行 synchronized(obj) 就會將 Monitor 的所有者 Owner 置為 Thread-2,Monitor中只能有一個 Owner 在 Thread-2 上鎖的過程中,如果 Thread-3,Thread-4,Thread-5 也來執行 synchronized(obj),就會進入EntryList BLOCKED Thread-2 執行完同步代碼塊的內容,然后喚醒 EntryList 中等待的線程來競爭鎖,競爭的時是非公平的 圖中 WaitSet 中的 Thread-0,Thread-1 是之前獲得過鎖,但條件不滿足進入 WAITING 狀態的線程

注意:不加 synchronized 的對象不會關聯監視器

4、synchronized的原理

通過對Java代碼進行反編譯可知,Synchronized的語義底層是通過一個monitor的對象來完成,其實wait/notify等方法也依賴于monitor對象,這就是為什么只有在同步的塊或者方法中才能調用wait/notify等方法,否則會拋出java.lang.IllegalMonitorStateException的異常的原因。

從JDK5引入了現代操作系統新增加的CAS原子操作( JDK5中并沒有對synchronized關鍵字做優化,而是體現在J.U.C中,所以在該版本concurrent包有更好的性能 ),從JDK6開始,就對synchronized的實現機制進行了較大調整,包括使用JDK5引進的CAS自旋之外,還增加了自適應的CAS自旋、鎖消除、鎖粗化、偏向鎖、輕量級鎖這些優化策略。由于此關鍵字的優化使得性能極大提高.

鎖主要存在四種狀態,依次是:無鎖狀態、偏向鎖狀態、輕量級鎖狀態、重量級鎖狀態,鎖可以從偏向鎖升級到輕量級鎖,再升級的重量級鎖。但是鎖的升級是單向的,也就是說只能從低到高升級,不會出現鎖的降級。

在 JDK 1.6 中默認是開啟偏向鎖和輕量級鎖的,可以通過-XX:-UseBiasedLocking來禁用偏向鎖。

4.1偏向鎖

Java 6 中引入了偏向鎖來做進一步優化:只有第一次使用 CAS 將線程 ID 設置到對象的 Mark Word 頭,之后發現 這個線程 ID 是自己的就表示沒有競爭,不用重新 CAS。以后只要不發生競爭,這個對象就歸該線程所有。

JAVAsynchronized原理詳解

調用了對象的 hashCode,但偏向鎖的對象 MarkWord 中存儲的是線程 id,如果調用 hashCode 會導致偏向鎖被撤銷

輕量級鎖會在鎖記錄中記錄 hashCode 重量級鎖會在 Monitor 中記錄 hashCode4.2輕量級鎖

輕量級鎖的使用場景:如果一個對象雖然有多線程要加鎖,但加鎖的時間是錯開的(也就是沒有競爭),那么可以使用輕量級鎖來優化。輕量級鎖對使用者是透明的,即語法仍然是 synchronized。

引入輕量級鎖的主要目的是 在沒有多線程競爭的前提下,減少傳統的重量級鎖使用操作系統互斥量產生的性能消耗。當關閉偏向鎖功能或者多個線程競爭偏向鎖導致偏向鎖升級為輕量級鎖,則會嘗試獲取輕量級鎖。

4.3鎖膨脹

如果在嘗試加輕量級鎖的過程中,CAS 操作無法成功,這時一種情況就是有其它線程為此對象加上了輕量級鎖(有 競爭),這時需要進行鎖膨脹,將輕量級鎖變為重量級鎖。

4.4重量級鎖

Synchronized是通過對象內部的一個叫做 監視器鎖(Monitor)來實現的。但是監視器鎖本質又是依賴于底層的操作系統的Mutex Lock來實現的。而操作系統實現線程之間的切換這就需要從用戶態轉換到核心態,這個成本非常高,狀態之間的轉換需要相對比較長的時間,這就是為什么Synchronized效率低的原因。因此,這種依賴于操作系統Mutex Lock所實現的鎖我們稱之為 “重量級鎖”。

4.5自旋鎖

線程的阻塞和喚醒需要CPU從用戶態轉為核心態,頻繁的阻塞和喚醒對CPU來說是一件負擔很重的工作,勢必會給系統的并發性能帶來很大的壓力。同時我們發現在許多應用上面,對象鎖的鎖狀態只會持續很短一段時間,為了這一段很短的時間頻繁地阻塞和喚醒線程是非常不值得的。

所以引入自旋鎖,何謂自旋鎖?

所謂自旋鎖,就是指當一個線程嘗試獲取某個鎖時,如果該鎖已被其他線程占用,就一直循環檢測鎖是否被釋放,而不是進入線程掛起或睡眠狀態。

4.6鎖消除

消除鎖是虛擬機另外一種鎖的優化,這種優化更徹底,Java虛擬機在JIT編譯時(可以簡單理解為當某段代碼即將第一次被執行時進行編譯,又稱即時編譯),通過對運行上下文的掃描,去除不可能存在共享資源競爭的鎖,通過這種方式消除沒有必要的鎖,可以節省毫無意義的請求鎖時間,如下StringBuffer的append是一個同步方法,但我們將StringBuffer作為一個局部變量使用,并且不會被其他線程所使用,因此StringBuffer不可能存在共享資源競爭的情景,JVM會自動將其鎖消除。

4.7鎖粗化

在使用同步鎖的時候,需要讓同步塊的作用范圍盡可能小—僅在共享數據的實際作用域中才進行同步,這樣做的目的是 為了使需要同步的操作數量盡可能縮小,如果存在鎖競爭,那么等待鎖的線程也能盡快拿到鎖。

在大多數的情況下,上述觀點是正確的。但是如果一系列的連續加鎖解鎖操作,可能會導致不必要的性能損耗,所以引入鎖粗話的概念。

鎖粗話概念比較好理解,就是將多個連續的加鎖、解鎖操作連接在一起,擴展成一個范圍更大的鎖

5、鎖升級過程

各種鎖并不是相互代替的,而是在不同場景下的不同選擇,絕對不是說重量級鎖就是不合適的。每種鎖是只能升級,不能降級,即由偏向鎖->輕量級鎖->重量級鎖,而這個過程就是開銷逐漸加大的過程。

如果是單線程使用,那偏向鎖毫無疑問代價最小,并且它就能解決問題,連CAS都不用做,僅僅在內存中比較下對象頭就可以了;

如果出現了其他線程競爭,則偏向鎖就會升級為輕量級鎖;

如果其他線程通過一定次數的CAS嘗試沒有成功,則進入重量級鎖;

JAVAsynchronized原理詳解

JAVAsynchronized原理詳解

總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注好吧啦網的更多內容!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲免费毛片| 国产高清亚洲| 亚洲精品国产偷自在线观看| 精品久久免费| 欧美在线观看视频一区| 日本久久一区| 亚洲一级少妇| 日本久久二区| a日韩av网址| 亚洲免费专区| 日本不卡一区二区| 国产九一精品| 亚洲免费网址| 欧美丰满日韩| 国产视频一区三区| 欧美激情另类| 日本aⅴ精品一区二区三区 | 久久精品中文| 日韩精品成人在线观看| 国产二区精品| 女同性一区二区三区人了人一| 久久国际精品| 亚洲一区二区网站| 午夜精品福利影院| 亚洲在线观看| 国产精品国产一区| 欧美亚洲免费| 国产一区二区精品福利地址| 亚洲区国产区| 久久蜜桃精品| 国产a久久精品一区二区三区| 久久网站免费观看| 色爱综合网欧美| 国产精品啊啊啊| 亚洲黑丝一区二区| 国产调教精品| 日日摸夜夜添夜夜添国产精品| 亚洲一二三区视频| 国产成人免费av一区二区午夜| 日韩二区在线观看| 日本一区中文字幕| 亚洲精品一区三区三区在线观看| 麻豆一区二区三区| 国产亚洲欧美日韩精品一区二区三区 | 日韩高清不卡一区| 亚洲一区日本| 亚洲专区一区| 蜜桃久久精品一区二区| 在线视频日韩| 欧美天堂亚洲电影院在线观看| 精品一区二区三区亚洲| 99香蕉国产精品偷在线观看 | 丝袜美腿一区| 在线精品亚洲欧美日韩国产| 国产成年精品| 日韩在线观看中文字幕| 黄色成人91| 中文一区在线| 麻豆精品久久久| 久久免费精品| 亚洲毛片一区| 亚洲日韩视频| 九九久久婷婷| 黄色国产精品| 亚洲乱码一区| 国产一区清纯| 亚洲一区日本| 四虎精品永久免费| 国产一区二区三区四区二区| 日日夜夜免费精品| 日韩av免费| 激情丁香综合| 四虎成人av| 欧洲一级精品| 欧美精品高清| 免费成人性网站| 日韩精品视频网| 国产精品1区在线| 国产精品久久久久久久久久齐齐 | 欧美日韩三区| 视频一区二区三区中文字幕| 亚洲综合丁香| 亚洲一区亚洲| 午夜日韩福利| 日韩欧美精品一区二区综合视频| 日韩在线黄色| 蜜桃视频一区二区三区在线观看| 日本成人在线不卡视频| 久久精品国产精品亚洲毛片| bbw在线视频| 国内揄拍国内精品久久| 99久久婷婷| 69堂免费精品视频在线播放| 中文一区一区三区免费在线观 | 美女久久久久久| 亚洲一级少妇| 丝袜脚交一区二区| 国产精品高清一区二区| 伊人久久亚洲| 精品99在线| 久久人人99| 免费视频国产一区| 中文一区一区三区高中清不卡免费| 久久精品国产亚洲一区二区三区| 美女网站视频一区| 91精品观看| 久久激情综合网| 99久久久久国产精品| 久久国内精品视频| 国产精品一国产精品k频道56| 亚洲成人不卡| 欧美日韩亚洲一区二区三区在线| 精品网站999| 国产中文字幕一区二区三区| 爽好久久久欧美精品| 欧美国产先锋| 天堂网在线观看国产精品| 西西人体一区二区| 亚洲精品一级| 91精品韩国| 在线午夜精品| 精品久久影院| 日韩成人在线看| 九九九精品视频| 日韩专区一卡二卡| 日韩深夜视频| 日本高清不卡一区二区三区视频| 99久久www免费| 国产精品成人自拍| 亚洲精选成人| 国产欧美日韩精品高清二区综合区 | 亚欧洲精品视频在线观看| 日韩免费av| 亚州av一区| 久久精品国产99国产| 日韩视频二区| 中文字幕人成乱码在线观看 | 一区二区自拍| 日韩av一区二区三区四区| 91亚洲精品在看在线观看高清| 在线一区视频| 国产网站在线| 国产精品nxnn| 国产一区亚洲| 国产成人精品三级高清久久91| 日韩精品一区二区三区中文在线| 欧美国产亚洲精品| 国产99久久| 精品视频91| 麻豆久久久久久| 亚洲激情五月| 一本大道色婷婷在线| 国产精久久久| 黄毛片在线观看| 国产不卡一区| 麻豆国产精品视频| 日韩精品高清不卡| 亚洲国内精品| 亚洲不卡系列| 日韩欧美三级| 亚洲日本久久| 欧美日韩在线精品一区二区三区激情综合 | 国产乱人伦精品一区| 中文字幕日本一区| 免费视频亚洲| 国产主播一区| 99在线精品免费视频九九视| 欧美成人精品三级网站| 久久一区精品| 麻豆成人在线观看| 性一交一乱一区二区洋洋av| 久久久精品五月天| 999国产精品永久免费视频app| 欧美国产另类| 免费看日韩精品| 综合一区二区三区| 日本在线不卡视频| 亚洲精品小说| 美国欧美日韩国产在线播放| 亚洲精品字幕| 天堂va欧美ⅴa亚洲va一国产| 国产精品丝袜在线播放| 日本aⅴ亚洲精品中文乱码| 日本a口亚洲| 91午夜精品| 免费在线观看成人| 日本欧美大码aⅴ在线播放| 日韩va欧美va亚洲va久久| 国产精品日韩欧美一区| 石原莉奈在线亚洲二区| 日本国产一区| 久久99高清| 欧美日韩中文| 日韩av片子| japanese国产精品| 国产在线一区不卡| 福利视频一区| 中文字幕中文字幕精品| 国产高清视频一区二区| 日韩福利在线观看|