米利唐_后腰_乌克兰足球超级联赛_中国竞彩欧赔 - 足球竞彩分析

集團官網
  • 國家級全民數字素養與技能培訓基地
  • 河南省第一批產教融合型企業建設培育單位
  • 鄭州市數字技能人才(碼農)培養評價聯盟

JVM對Java的原生鎖做了哪些優化?

編輯:云和數據 日期:2023-05-31 09:04

JVM對Java的原生鎖(即synchronized關鍵字)做了許多優化,其中包括:

1.偏向鎖(Biased Locking)

當一個線程獲取鎖后,JVM會將鎖的對象頭標記為偏向鎖。此時,該線程可以無需競爭地獲取該鎖。這種情況下,鎖的獲取和釋放不需要額外的開銷,因為偏向鎖會記錄線程ID,使得在該線程持有鎖期間,其他線程無法獲取該鎖。只有在其他線程嘗試獲取鎖時,才會升級為輕量級鎖。

2.輕量級鎖(Lightweight Locking)

當多個線程爭奪鎖時,JVM會將鎖標記為輕量級鎖。此時,JVM會在鎖對象的對象頭中記錄指向線程棧中鎖記錄的指針,以及用于保存原始對象的指針。這樣,當一個線程嘗試獲取該鎖時,JVM會將該線程的棧幀中的鎖記錄與鎖對象頭中的指針進行比較。如果相同,則表示該線程已經獲得了該鎖;否則,JVM會使用CAS操作嘗試將鎖對象頭中的指針指向當前線程的鎖記錄。如果CAS操作成功,表示當前線程成功獲得了鎖。否則,表示有其他線程爭奪該鎖,此時JVM會將鎖升級為重量級鎖。

3.重量級鎖(Heavyweight Locking)

當多個線程爭奪鎖時,如果無法獲得鎖,則會升級為重量級鎖。此時,JVM會使用操作系統的互斥量實現鎖。重量級鎖的開銷非常大,因為需要進行用戶態與內核態之間的上下文切換。

下面是一個簡單的代碼演示,展示了偏向鎖、輕量級鎖和重量級鎖的使用情況。

public?class?SynchronizedDemo?{????private?int?count?=?0;????public?synchronized?void?increment()?{????????count++;????}????public?static?void?main(String[]?args)?{????????SynchronizedDemo?demo?=?new?SynchronizedDemo();????????for?(int?i?=?0;?i?

在這個示例中,我們使用synchronized關鍵字來對increment()方法進行同步。由于該方法是實例方法,因此鎖對象是該實例對象。當多個線程同時訪問該方法時,JVM會根據鎖的狀態來選擇使用偏向鎖、輕量級鎖或重量級鎖。具體的選擇過程是由JVM內部的鎖升級算法來決定的,這里不再詳細展開。

相關內容

搶先一步 鴻蒙(HarmonyOS)應用開發者高級認證 免費考! 適合人群計算機相關專業在校生(技師、中職、高職、本科、研究生)對鴻蒙(HarmonyOS)有興趣的非計算機相關專業在校生目前正在從事移動應用的開發者目前正在從事計算機行業相關的人計算機專業高校老師所有對鴻蒙(HarmonyOS)有興趣的人 培訓方案掌握鴻蒙的核心概念和端云一體化開發、... 什么是Java的多態性(polymorphism)?它有哪些不同的形式? 多態性是Java面向對象編程的一個重要概念,它允許不同的對象以一致的方式響應同一個方法調用,具體表現為對象在運行時可以表現出多個不同的形態。多態性主要有兩種不同的形式:編譯時多態性(靜態多態性)和運行時多態性(動態多態性)。1. 編譯時多態性(靜態多態性):   ... 如何學習和搭建Hadoop開發環境? Hadoop是大數據處理領域的重要平臺,能夠處理和分析大量數據。為了有效地利用Hadoop,我們需要學習其基礎知識,并正確搭建開發環境。下面是詳細的學習和搭建指南。一、學習Hadoop基礎掌握基礎概念和原理Hadoop主要由HDFS和MapReduce兩部分組成。HDFS是分布式文件系統,Ma... UI 設計學習如何進階成為高手 我總結了六種方法,幫助你走出舒適區,提高技能,成長為自信且經驗豐富的UI設計高手一位經驗豐富的 UI 設計師,往往十分看中應用程序界面的吸引力和視覺刺激,確保滿足用戶期望和需求。但是,如果你已經在 UI 設計圈摸爬滾打多年,仍然沒有出色的作品,那你極有可能是因為陷入了一個舒適圈,UI技能一直原... 在Java中Executor和Executors的區別? 在Java中,Executor和Executors都與線程池和并發執行有關,但它們是不同的概念和類。1.ExecutorExecutor是一個接口,位于java.util.concurrent包中,用于表示一個執行任務的執行器。它只定義了一個方法:void execute(Runnable c... String類型的常見命令有哪些? String類型,也就是字符串類型,是Redis中最簡單的存儲類型。其value是字符串,不過根據字符串的格式不同,又可以分為3類:string是普通字符串,int整數類型,可以做自增、自減操作,float浮點類型,可以做自增、自減操作。String的常見命令有:SET:添加或者修改已經存在的...