Java中的synchronized鎖定膨脹機制怎麼實現
synchronized
在JDK 1.5 時,synchronized 需要呼叫監視器鎖(Monitor)來實現,監視器鎖定本質上又是依賴底層的作業系統的Mutex Lock(互斥鎖)實現的,互斥鎖在進行釋放和獲取的時候,需要從用戶態轉換到內核態,這樣就造成了很高的成本,也需要較長的執行時間,這種依賴作業系統Mutex Lock 實作的鎖我們稱之為「重量級鎖」。
什麼是使用者態和核心態?
使用者狀態(User Mode):當進程在執行使用者自己的程式碼時,則稱為使用者執行態。核心態(Kernel Mode):當一個任務(進程)執行系統呼叫而陷入核心程式碼中執行時,我們就稱進程處於核心運行態,此時處理器處於特權級最高的核心程式碼中執行。
為什麼分內核狀態與使用者狀態?
假設沒有內核態和用戶態之分,程式就可以隨意讀寫硬體資源了,例如隨意讀寫和分配內存,這樣如果程式設計師一不小心將不適當的內容寫到了不該寫的地方,很可能就會導致系統崩潰。
而有了用戶態和內核態的區分之後,程式在執行某個操作時會進行一系列的驗證和檢驗之後,確認沒問題之後才可以正常的操作資源,這樣就不會擔心一不小心就把系統搞壞的情況了,也就是有了內核態和用戶態的區分之後可以讓程式更加安全的運行,但同時兩種形態的切換會導致一定的性能開銷。
鎖定膨脹
在JDK 1.6 時,為了解決取得鎖定和釋放鎖定所帶來的效能消耗,引入了「偏向鎖定」和「輕量級鎖定」的狀態,此時synchronized 的狀態總共有以下4 個:
無鎖定
- ##偏向鎖定
#輕量級鎖定 重量級鎖定
# 鎖定的等級依照上述先後順序依序升級,我們把這個升級的過程稱之為「鎖膨脹」。
PS:到現在為止,鎖定的升級是單向的,也就是說只能從低到高升級(無鎖定-> ; 偏向鎖-> 輕量級鎖定-> 重量級鎖),不會有鎖定降級的情況。- 鎖定膨脹為什麼能優化 synchronized 的效能?當我們了解了這些鎖狀態之後自然就會有答案,下面我們一起來看。
偏向鎖定
HotSpot 作者經過研究實踐發現,在大多數情況下,鎖不存在多線程競爭,總是由同一線程多次獲得的,為了讓線程獲得鎖的代價更低,於是引進了偏向鎖。 偏向鎖(Biased Locking)指的是,它會偏向第一個訪問鎖的線程,如果在運行過程中,同步鎖只有一個線程訪問,不存在多線程爭用的情況,則線程是不需要觸發同步的,這種情況下會給線程加一個偏向鎖。
偏向鎖定執行流程當一個執行緒存取同步程式碼區塊並取得鎖定時,會在物件頭的Mark Word 裡儲存鎖偏向的執行緒ID,在執行緒進入和退出同步區塊時不再透過CAS 操作來加鎖和解鎖,而是檢測Mark Word 裡是否儲存指向當前線程的偏向鎖,如果Mark Word 中的線程ID 和訪問的線程ID 一致,則可以直接進入同步區塊進行程式碼執行,如果執行緒ID 不同,則使用CAS 嘗試取得鎖,如果取得成功則進入同步區塊執行程式碼,否則會將鎖的狀態升級為輕量級鎖定。
偏向鎖的優點
偏向鎖是為了在無多執行緒競爭的情況下,盡量減少不必要的鎖切換而設計的,因為鎖的取得及釋放要依賴多次CAS 原子指令,而偏向鎖只需要在置換線程ID 的時候執行一次CAS 原子指令即可。
- Mark Word 擴充知識:記憶體佈局
在HotSpot 虛擬機器中,物件在記憶體中儲存的佈局可以分為以下3 個區域:
物件頭(Header)- 實例資料(Instance Data)
對齊填充(Padding)
##物件頭中又包含了:
在 JDK 1.6 中預設是開啟偏向鎖定的,可以透過「-XX:-UseBiasedLocking=false」指令來停用偏向鎖定。
輕量級鎖定
引入輕量級鎖定的目的是在沒有多執行緒競爭的前提下,減少傳統的重量級鎖定使用作業系統Mutex Lock(互斥鎖)產生的性能消耗。如果使用 Mutex Lock 每次取得鎖和釋放鎖的操作都會帶來使用者態和核心態的切換,這樣系統的效能開銷是很大的。
當關閉偏向鎖或多個執行緒競爭偏向鎖時就會導致偏向鎖升級為輕量級鎖,輕量級鎖的取得和釋放都透過CAS 完成的,其中鎖取得可能會透過一定次數的自旋來完成。
注意事項
需要強調一點:輕量級鎖定並不是用來取代重量級鎖定的,它的本意是在沒有多執行緒競爭的前提下,減少傳統的重量級鎖定使用產生的性能消耗。輕量級鎖所適應的場景是執行緒交替執行同步區塊的情況,如果同一時間多個執行緒同時存取時,就會導致輕量級鎖定膨脹為重量級鎖定。
重量級鎖定
synchronized 是依賴監視器Monitor 實作方法同步或程式碼區塊同步的,程式碼區塊同步使用的是monitorenter 和monitorexit 指令來實現的,monitorenter 指令是在編譯後插入到同步程式碼區塊的開始位置,而monitorexit 是插入到方法結束處和異常處的,任何物件都有一個Monitor 與之關聯,當且一個Monitor 被持有後,它將處於鎖定狀態。
如下加鎖程式碼:
public class SynchronizedToMonitorExample { public static void main(String[] args) { int count = 0; synchronized (SynchronizedToMonitorExample.class) { for (int i = 0; i < 10; i++) { count++; } } System.out.println(count); } }
當我們將上述程式碼編譯成字節碼之後,它的內容是這樣的:
從上述結果可以看出,在main 方法的執行中多個monitorenter 和monitorexit 的指令,由此可知synchronized 是依賴Monitor 監視器鎖實現的,而監視器鎖又是依賴作業系統的互斥鎖(Mutex Lock),互斥鎖在每次取得和釋放鎖時,都會帶來用戶態和核心態的切換,這樣就增加了系統的效能開銷。
以上是Java中的synchronized鎖定膨脹機制怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。
