" />

亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java synchronized重量級鎖實現(xiàn)過程淺析

 更新時間:2023年02月11日 15:50:25   作者:每天都要進步一點點  
這篇文章主要介紹了Java synchronized重量級鎖實現(xiàn)過程,synchronized是Java里的一個關(guān)鍵字,起到的一個效果是"監(jiān)視器鎖",它的功能就是保證操作的原子性,同時禁止指令重排序和保證內(nèi)存的可見性

一、什么是重量級鎖

當(dāng)有大量的線程都在競爭同一把鎖的時候,這個時候加的鎖,就是重量級鎖。

這個重量級鎖其實指的就是JVM內(nèi)部的ObjectMonitor監(jiān)視器對象:

ObjectMonitor() {
    _header       = NULL;		//鎖對象的原始對象頭
    _count        = 0;			//搶占當(dāng)前鎖的線程數(shù)量
    _waiters      = 0,			//調(diào)用wait方法后等待的線程數(shù)量
    _recursions   = 0;			//記錄鎖重入次數(shù)
    _object       = NULL;
    _owner        = NULL;		//指向持有ObjectMonitor的線程
    _WaitSet      = NULL;		//處于wait狀態(tài)的線程隊列,等待被喚醒
    _WaitSetLock  = 0 ;
    _Responsible  = NULL ;
    _succ         = NULL ;
    _cxq          = NULL ;
    FreeNext      = NULL ;
    _EntryList    = NULL ;		//等待鎖的線程隊列
    _SpinFreq     = 0 ;
    _SpinClock    = 0 ;
    OwnerIsThread = 0 ;
    _previous_owner_tid = 0;
  }

二、重量級鎖的演示

public class HightweightLockDemo02 {
    public static void main(String[] args) {
        Object objLock = new Object();
        new Thread(() -> {
            synchronized (objLock) {
                System.out.println(ClassLayout.parseInstance(objLock).toPrintable());
            }
        }, "t1").start();
        new Thread(() -> {
            synchronized (objLock) {
                System.out.println(ClassLayout.parseInstance(objLock).toPrintable());
            }
        }, "t2").start();
    }
}

運行程序:

java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           1a 33 c9 e1 (00011010 00110011 11001001 11100001) (-506907878)
      4     4        (object header)                           43 01 00 00 (01000011 00000001 00000000 00000000) (323)
      8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           1a 33 c9 e1 (00011010 00110011 11001001 11100001) (-506907878)
      4     4        (object header)                           43 01 00 00 (01000011 00000001 00000000 00000000) (323)
      8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

可見,當(dāng)多個線程共同搶占同一把鎖的時候,鎖對象MarkWord的最后三位是“010”,代表的就是一個重量級鎖。

三、重量級鎖的原理

以上述代碼為例,synchronized獲取的鎖是重量級鎖,synchronized修飾代碼塊,使用javap -p -v .\HightweightLockDemo02.class指令查看其字節(jié)碼:

在編譯的時候,JVM會在同步塊開始位置插入monitorenter指令,在同步塊結(jié)束位置插入monitorexit指令。當(dāng)線程執(zhí)行到monitorenter指令時,會嘗試獲取對象所對應(yīng)的Monitor所有權(quán),如果獲取成功,則表示獲取到了鎖,會在Monitor的_owner中存在當(dāng)前線程的ID,這樣它將處于鎖定狀態(tài),除非退出同步塊,否則其他線程無法獲取得到這個Monitor。

四、鎖的優(yōu)缺點對比

下表是對各種狀態(tài)的鎖的對比:

鎖的類型優(yōu)點缺點適用場景
偏向鎖加鎖和解鎖不需要額外的消耗,和執(zhí)行非同步方法相比僅存在納秒級的差距如果線程間存在鎖競爭,會帶來額外的鎖撤銷的消耗適用于只有一個線程訪問同步塊場景
輕量級鎖競爭的線程不會阻塞,提高了程序的響應(yīng)速度如果始終得不到鎖競爭的線程,使用自旋會消耗CPU,導(dǎo)致CPU空轉(zhuǎn)追求響應(yīng)時間 同步塊執(zhí)行速度非???/td>
重量級鎖線程競爭不使用自旋,不會消耗CPU線程阻塞,響應(yīng)時間緩慢追求吞吐量 同步塊執(zhí)行時間較長

到此這篇關(guān)于Java synchronized重量級鎖實現(xiàn)過程淺析的文章就介紹到這了,更多相關(guān)Java synchronized 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java基礎(chǔ)之簡單的圖片處理

    Java基礎(chǔ)之簡單的圖片處理

    這篇文章主要介紹了Java基礎(chǔ)之簡單的圖片處理,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • struts2實現(xiàn)多文件上傳

    struts2實現(xiàn)多文件上傳

    這篇文章主要為大家詳細(xì)介紹了struts2實現(xiàn)多文件上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Java高性能新一代構(gòu)建工具Maven-mvnd(實踐可行版)

    Java高性能新一代構(gòu)建工具Maven-mvnd(實踐可行版)

    這篇文章主要介紹了Java高性能新一代構(gòu)建工具Maven-mvnd(實踐可行版),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • Java中SimpleDateFormat方法超詳細(xì)分析

    Java中SimpleDateFormat方法超詳細(xì)分析

    這篇文章主要給大家介紹了關(guān)于Java中SimpleDateFormat方法超詳細(xì)分析的相關(guān)資料,SimpleDateFormat 是一個以國別敏感的方式格式化和分析數(shù)據(jù)的具體類,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • 基于java高并發(fā)處理方案

    基于java高并發(fā)處理方案

    這篇文章主要介紹了基于java高并發(fā)處理方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java編程線程間通信與信號量代碼示例

    Java編程線程間通信與信號量代碼示例

    這篇文章主要介紹了Java編程線程間通信與信號量代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Springboot轉(zhuǎn)發(fā)重定向?qū)崿F(xiàn)方式解析

    Springboot轉(zhuǎn)發(fā)重定向?qū)崿F(xiàn)方式解析

    這篇文章主要介紹了springboot轉(zhuǎn)發(fā)重定向?qū)崿F(xiàn)方式解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 使用synchronized實現(xiàn)一個Lock代碼詳解

    使用synchronized實現(xiàn)一個Lock代碼詳解

    這篇文章主要介紹了使用synchronized實現(xiàn)一個Lock代碼詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • java文件上傳至ftp服務(wù)器的方法

    java文件上傳至ftp服務(wù)器的方法

    這篇文章主要為大家詳細(xì)介紹了java文件上傳至ftp服務(wù)器的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • java線程池對象ThreadPoolExecutor的深入講解

    java線程池對象ThreadPoolExecutor的深入講解

    在我們的開發(fā)中“池”的概念并不罕見,有數(shù)據(jù)庫連接池、線程池、對象池、常量池等等。下面這篇文章主要給大家介紹了關(guān)于java線程池對象ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-09-09

最新評論