<code id="nbzwf"></code>
  1. <var id="nbzwf"></var>
    1. <meter id="nbzwf"></meter>
        <option id="nbzwf"><menuitem id="nbzwf"></menuitem></option><listing id="nbzwf"><delect id="nbzwf"><p id="nbzwf"></p></delect></listing>
        • Java不可重入鎖和可重入鎖理解

          發布:51Code 時間: 2019-04-15 09:37

        • 最近正在閱讀Java ReentrantLock源碼,始終對可重入和不可重入概念理解不透徹,進行學習后記錄在這里。 基礎知識 Java多線程的wait()方法和notify()方法 這兩個方法是成對出現和使用的,要...

        • 最近正在閱讀Java ReentrantLock源碼,始終對可重入和不可重入概念理解不透徹,進行學習后記錄在這里。

          基礎知識

          Java多線程的wait()方法和notify()方法

          這兩個方法是成對出現和使用的,要執行這兩個方法,有一個前提就是,當前線程必須獲其對象的monitor(俗稱“鎖”),否則會拋出IllegalMonitorStateException異常,所以這兩個方法必須在同步塊代碼里面調用。

          wait():阻塞當前線程

          notify():喚起被wait()阻塞的線程

          不可重入鎖

          所謂不可重入鎖,即若當前線程執行某個方法已經獲取了該鎖,那么在方法中嘗試再次獲取鎖時,就會獲取不到被阻塞。我們嘗試設計一個不可重入鎖:

          使用該鎖:

          當前線程執行print()方法首先獲取lock,接下來執行doAdd()方法就無法執行doAdd()中的邏輯,必須先釋放鎖。這個例子很好的說明了不可重入鎖。

          可重入鎖

          接下來,我們設計一種可重入鎖

          所謂可重入,意味著線程可以進入它已經擁有的鎖的同步代碼塊兒。

          我們設計兩個線程調用print()方法,第一個線程調用print()方法獲取鎖,進入lock()方法,由于初始lockedBy是null,所以不會進入while而掛起當前線程,而是是增量lockedCount并記錄lockBy為第一個線程。接著第一個線程進入doAdd()方法,由于同一進程,所以不會進入while而掛起,接著增量lockedCount,當第二個線程嘗試lock,由于isLocked=true,所以他不會獲取該鎖,直到第一個線程調用兩次unlock()將lockCount遞減為0,才將標記為isLocked設置為false。

          可重入鎖的概念和設計思想大體如此,Java中的可重入鎖ReentrantLock設計思路也是這樣。

          文章來源:網絡 版權歸原作者所有
          如涉及知識產權問題,請權利人聯系博為峰小編(021-64471599-8103),我們將立即處理。

        • 上一篇:網傳華為 Java 編程軍規

          下一篇:從入門到熟悉 HTTPS 的 9 個問題

        網站導航
        Copyright(C)51Code軟件開發網 2003-2019 , 滬ICP備05003035號-6
        北京快三路线温都水城

          <code id="nbzwf"></code>
        1. <var id="nbzwf"></var>
          1. <meter id="nbzwf"></meter>
              <option id="nbzwf"><menuitem id="nbzwf"></menuitem></option><listing id="nbzwf"><delect id="nbzwf"><p id="nbzwf"></p></delect></listing>

                <code id="nbzwf"></code>
              1. <var id="nbzwf"></var>
                1. <meter id="nbzwf"></meter>
                    <option id="nbzwf"><menuitem id="nbzwf"></menuitem></option><listing id="nbzwf"><delect id="nbzwf"><p id="nbzwf"></p></delect></listing>
                    老时时杀号 四川时时彩结果 七星游戏湖南棋牌下载安装 最新福建快3开奖结果 能赚现金的捕鱼游戏 北京时时软件 重庆时时彩视频开奖直播下载 赛车pk免费计划 一分赛车计划网 福建体彩26选5