<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ReentrantLock 的實現原理主要依賴于 Java 中的 AbstractQueuedSynchronizer(AQS)類。AQS 是一個用于構建鎖和同步器的框架,ReentrantLock 是基于 AQS 實現的可重入鎖。 以下是 ReentrantLock 的一些關鍵實現原理: 1. 鎖狀態:ReentrantLock 使用一個整數來表示鎖的狀態。0 表示未鎖定,1 表示已鎖定。 2. 可重入性:通過維護一個線程持有鎖的次數來實現可重入性。當一個線程獲取鎖時,鎖狀態增加;當線程釋放鎖時,鎖狀態減少。如果鎖狀態為 0,則表示鎖已被完全釋放。 3. 等待隊列:當線程獲取鎖失敗時,會被加入到一個等待隊列中。等待隊列是一個雙向鏈表,按照先進先出的原則存儲等待線程。 4. 鎖獲取:當一個線程嘗試獲取鎖時,首先檢查鎖狀態。如果鎖未被占用,則直接獲取鎖并更新鎖狀態。如果鎖已被其他線程占用,則根據公平性策略決定是否阻塞等待。公平性策略可以是公平的(按照線程請求鎖的順序分配鎖)或非公平的(允許插隊獲取鎖)。 5. 鎖釋放:當一個線程釋放鎖時,更新鎖狀態,并喚醒等待隊列中的下一個線程(如果有)。 ### ReentrantLock 的實現原理 #### 1\. 基本概念 * **可重入**:同一個線程在持有鎖的情況下,可以再次獲得該鎖,不會被阻塞。這解決了遞歸調用或者需要在鎖內調用其他需要相同鎖保護的方法時可能遇到的死鎖問題。 * **公平鎖與非公平鎖**:`ReentrantLock` 可以支持公平鎖和非公平鎖。公平鎖的策略是按照線程請求鎖的順序來分配鎖,而非公平鎖則可能會讓后來的線程插隊,從而提高吞吐量。默認情況下,`ReentrantLock` 是非公平鎖。 #### 2\. 內部實現 `ReentrantLock` 的內部是通過繼承自 `AbstractQueuedSynchronizer` (AQS) 來實現的。AQS 是一個提供鎖和同步器底層支持的框架,`ReentrantLock` 使用 AQS 來實現其鎖的管理。 ##### AQS (AbstractQueuedSynchronizer) AQS 使用一個 `int` 變量(`state`)來表示鎖的狀態,并通過 `FIFO` 隊列來管理獲取鎖失敗的線程。 * **state變量**:`state` 表示鎖的狀態,0 表示鎖未被持有,1 表示鎖被持有。對于可重入鎖,`state` 的值表示當前線程獲得鎖的次數。 * **FIFO隊列**:AQS 內部維護了一個 `FIFO` 隊列,當一個線程請求鎖失敗時,線程會被加入到這個隊列中等待鎖的釋放。 * **鎖獲取與釋放**: * `acquire(int arg)`:嘗試獲取鎖,鎖不可用時將當前線程加入隊列并阻塞。 * `release(int arg)`:釋放鎖,嘗試喚醒隊列中的下一個等待線程。 ##### 3\. ReentrantLock 的核心實現 `ReentrantLock` 通過內部的 `Sync` 類來實現鎖的核心邏輯。`Sync` 繼承自 AQS,分為兩種實現:`FairSync` 和 `NonFairSync`,分別對應公平鎖和非公平鎖。 ###### 非公平鎖(默認) ~~~ java復制代碼static final class NonfairSync extends Sync { final void lock() { // 嘗試直接獲取鎖(CAS操作),成功則立即獲得鎖,失敗則調用acquire方法進入AQS邏輯 if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); } // 嘗試獲取鎖 protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // 防止溢出 throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } } ~~~ * **非公平性**:`NonfairSync.lock()` 方法會直接嘗試通過 `CAS` 操作獲取鎖(`compareAndSetState(0, 1)`),如果成功則立即獲得鎖,避免了公平鎖的排隊等待。如果失敗,則調用 `acquire(1)` 進入 AQS 的邏輯,這一操作可能會將線程加入等待隊列。 * **重入性**:`tryAcquire` 方法中,如果當前線程已經持有鎖(即當前線程是鎖的擁有者),則增加 `state` 的值,表示鎖的重入。 ###### 公平鎖 ~~~ java復制代碼static final class FairSync extends Sync { final void lock() { acquire(1); } protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (!hasQueuedPredecessors() && compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // 防止溢出 throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } } ~~~ * **公平性**:`FairSync.tryAcquire` 方法首先會檢查 `hasQueuedPredecessors()`,即當前線程在等待隊列中是否有前驅線程,如果有,則當前線程不能插隊獲取鎖,必須排隊等待。 ##### 4\. 鎖的釋放 鎖的釋放由 `Sync.release(int arg)` 方法實現。 ~~~ java復制代碼protected final boolean tryRelease(int releases) { int c = getState() - releases; if (Thread.currentThread() != getExclusiveOwnerThread()) throw new IllegalMonitorStateException(); boolean free = false; if (c == 0) { free = true; setExclusiveOwnerThread(null); } setState(c); return free; } ~~~ * **釋放邏輯**:`tryRelease` 方法將 `state` 減去釋放的次數。如果 `state` 的值降為 0,表示當前線程已經完全釋放了鎖,`setExclusiveOwnerThread(null)` 將鎖的持有者設置為 `null`,然后返回 `true`,表示鎖已完全釋放。 #### 5\. 條件變量(Condition) `ReentrantLock` 支持條件變量(`Condition`),通過調用 `lock.newCondition()` 來創建。條件變量可以用來實現更細粒度的線程間通信。 * **await() 和 signal()**:`Condition` 提供了類似 `Object.wait()` 和 `Object.notify()` 的方法,比如 `await()` 和 `signal()`。當線程調用 `await()` 時,它會釋放鎖并進入等待狀態,直到其他線程調用 `signal()` 喚醒它。 #### 6\. 總結 * **可重入性**:`ReentrantLock` 允許同一線程多次獲取鎖,內部通過 `state` 變量和線程持有者來管理。 * **公平與非公平**:`ReentrantLock` 可以在創建時指定是否為公平鎖,通過不同的 `Sync` 實現來控制鎖的公平性。 * **靈活性**:相比 `synchronized`,`ReentrantLock` 提供了更多控制和更高的靈活性,比如超時獲取鎖、可中斷獲取鎖、條件變量等。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看