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 類及其方法的實際實現。
資料結構
網路
關係型資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP