Java中的可重入鎖


ReentrantLock 是一個實現了 Lock 介面的類。它提供了高度靈活的同步功能,因此它是 Java 中使用最廣泛的鎖類。它對於執行緒的可靠和公平執行是必要的。在這裡,執行緒是大型操作的小型子程序。在本文中,我們將學習 ReentrantLock 以及它們如何管理執行緒以高效地工作。

ReentrantLock 的工作原理

當多個執行緒嘗試訪問共享資源時,ReentrantLock 透過 `lock()` 和 `unlock()` 方法一次限制一個執行緒訪問。假設有三個試圖預訂火車票的人。同時,這三個人都會嘗試訪問預訂系統,可能會發生兩個人預訂了同一個座位的情況。Reentrant Lock 可以處理這種情況。

首先,這三個人都會透過 `tryLock()` 方法請求獲取預訂系統。當一個人獲取預訂系統後,它會透過 `lock()` 方法限制特定的座位預訂。預訂後,這個人會呼叫 `unlock()` 方法釋放已獲取的鎖。在資源繁忙期間,其他人會在佇列中等待輪到他們,並在鎖釋放後進入可執行狀態。

ReentrantLock 試圖以公平的方式提供鎖。我們可以設定執行緒可以獲取鎖的時間長度,並且它確保等待時間最長的執行緒可能首先獲得訪問鎖的許可權。預設情況下,鎖是不公平的,要使其公平,我們需要在其建構函式中傳遞布林值“true”。

語法

ReentrantLock nameOflock = new  ReentrantLock(); 
// by default false
Or,
ReentrantLock nameOflock = new  ReentrantLock(true); 
// we can make it true

鎖是顯式的,可以按任何順序鎖定或解鎖。單個執行緒可以多次請求鎖,這就是鎖名為 Reentrant 的原因。我們可以使用 `getHoldCount()` 方法計算鎖被獲取的次數。

示例

以下示例說明了 Reentrant Lock 的用法。

程式碼工作原理

  • 建立一個名為“Thrd”的類,並在該執行緒中定義一個 ReentrantLock 物件。

  • 定義一個名為“operation()”的方法,並帶有一個整數型別的引數。將 `tryLock()` 方法的布林值儲存到名為“lockAcquired”的變數中,該變數將檢查鎖是否被任何執行緒獲取。

  • 如果獲取了鎖,則使用 `lock()` 方法將鎖賦予該執行緒,並讓執行緒執行給定的任務。

  • 該任務將在 try 塊中執行,鎖將在 finally 塊中使用 `unlock()` 方法釋放。

  • 現在建立三個執行緒類並呼叫 `operation()` 方法。

  • 在 `main()` 方法中,定義三個執行緒類的物件並呼叫其 `start()` 方法以啟動執行緒的執行。

import java.util.concurrent.*;
import java.util.concurrent.locks.*;
class Thrd {
   // creating object of ReentrantLock class
   private static ReentrantLock lockr = new  ReentrantLock();
   static void operation(int data) {
     // give access to lock
     boolean lockAcquired = lockr.tryLock(); 
     if (lockAcquired) {
       try {
         lockr.lock(); 
         // giving lock to thread
         for(int i = 1; i <= 4; i++) {
            System.out.println(data++);
         }
         // checking lock count
         System.out.println("Count of Lock: " + lockr.getHoldCount());
       } finally {
         lockr.unlock(); 
         // unlocking the lock 
       }
     } else {
       System.out.println("I am in else block");
     }
   }
}
class Thrd1 extends Thread {
   // thread number 1 
   public void run() {
     Thrd.operation(1);
     // method calling  
   }
}
class Thrd2 extends Thread {
   // thread number 2 
   public void run() {
     Thrd.operation(5);  
     // method calling
   }
}
class Thrd3 extends Thread {
   // thread number 3
   public void run() {
     Thrd.operation(10);  
     // method calling
   }
}
public class ThrdExecution {
   public static void main(String args[]) {
     // creating object for thread class
     Thrd1 oprt1 = new Thrd1();
     Thrd2 oprt2 = new Thrd2();  
     Thrd3 oprt3 = new Thrd3();
     // Starting the thread operation
     oprt1.start();
     oprt2.start();  
     oprt3.start();
   }
}

輸出

1
2
3
4
I am in else block
I am in else block
Count of Lock: 2

結論

在本文中,我們學習了 ReentrantLock 類及其內建方法(如 `lock()`、`unlock()` 和 `trylock()`)的用法。此外,我們還建立了一個 Java 程式,其中我們看到了 ReentrantLock 類及其方法的實際實現。

更新於:2023年5月16日

335 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告