更新時間:2023年04月11日11時31分 來源:傳智教育 瀏覽次數(shù):
ReentrantLock實現(xiàn)可重入性的關(guān)鍵是使用了一個計數(shù)器來記錄當(dāng)前線程重入的次數(shù),即每當(dāng)一個線程獲取到鎖時,它的重入計數(shù)器會加1,當(dāng)這個線程再次請求鎖時,它會再次獲得鎖而不被阻塞,同時重入計數(shù)器繼續(xù)加1。當(dāng)線程退出鎖保護(hù)的代碼塊時,計數(shù)器遞減,直到計數(shù)器降為0時,鎖才被完全釋放。
下面是一個簡單的Java代碼演示ReentrantLock的可重入性:
import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockDemo { private ReentrantLock lock = new ReentrantLock(); private int count = 0; public void increment() { lock.lock(); // 獲取鎖 try { count++; System.out.println(Thread.currentThread().getName() + " count = " + count); increment(); // 遞歸調(diào)用,測試ReentrantLock的可重入性 } finally { lock.unlock(); // 釋放鎖 } } public static void main(String[] args) { final ReentrantLockDemo demo = new ReentrantLockDemo(); // 創(chuàng)建兩個線程,同時調(diào)用increment()方法 new Thread(new Runnable() { public void run() { demo.increment(); } }).start(); new Thread(new Runnable() { public void run() { demo.increment(); } }).start(); } }
在這個例子中,我們創(chuàng)建了一個ReentrantLock對象來保護(hù)一個共享資源count,并在increment()方法中獲取鎖。在increment()方法中,我們遞歸調(diào)用increment()方法來測試ReentrantLock的可重入性。
運(yùn)行程序后,你會發(fā)現(xiàn)兩個線程會不斷遞歸調(diào)用increment()方法,每個線程會自己維護(hù)一個計數(shù)器。這就是ReentrantLock的可重入性的體現(xiàn),每個線程可以重復(fù)獲取鎖,而不會被阻塞。當(dāng)程序遞歸調(diào)用次數(shù)達(dá)到一定值時,將會拋出StackOverflowError異常。