<ruby id="c4vej"><bdo id="c4vej"></bdo></ruby>
<dd id="c4vej"><track id="c4vej"><video id="c4vej"></video></track></dd>
  • <dd id="c4vej"><track id="c4vej"></track></dd>

        溫馨提示×

        Java?synchronized重量級鎖如何實現

        發布時間:2023-02-13 09:33:14 來源:億速云 閱讀:93 作者:iii 欄目:開發技術

        今天小編給大家分享一下Java synchronized重量級鎖如何實現的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

        一、什么是重量級鎖

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

        Java?synchronized重量級鎖如何實現

        Java?synchronized重量級鎖如何實現

        這個重量級鎖其實指的就是JVM內部的ObjectMonitor監視器對象:

        ObjectMonitor() {
            _header       = NULL;		//鎖對象的原始對象頭
            _count        = 0;			//搶占當前鎖的線程數量
            _waiters      = 0,			//調用wait方法后等待的線程數量
            _recursions   = 0;			//記錄鎖重入次數
            _object       = NULL;
            _owner        = NULL;		//指向持有ObjectMonitor的線程
            _WaitSet      = NULL;		//處于wait狀態的線程隊列,等待被喚醒
            _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

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

        三、重量級鎖的原理

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

        Java?synchronized重量級鎖如何實現

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

        Java?synchronized重量級鎖如何實現

        四、鎖的優缺點對比

        下表是對各種狀態的鎖的對比:

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

        以上就是“Java synchronized重量級鎖如何實現”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

        免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

        主題地圖

        ,日韩AV电影院
        <ruby id="c4vej"><bdo id="c4vej"></bdo></ruby>
        <dd id="c4vej"><track id="c4vej"><video id="c4vej"></video></track></dd>
      1. <dd id="c4vej"><track id="c4vej"></track></dd>