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 類及其方法的實際實現。