更新時(shí)間:2023年04月11日11時(shí)31分 來(lái)源:傳智教育 瀏覽次數(shù):
ReentrantLock實(shí)現(xiàn)可重入性的關(guān)鍵是使用了一個(gè)計(jì)數(shù)器來(lái)記錄當(dāng)前線程重入的次數(shù),即每當(dāng)一個(gè)線程獲取到鎖時(shí),它的重入計(jì)數(shù)器會(huì)加1,當(dāng)這個(gè)線程再次請(qǐng)求鎖時(shí),它會(huì)再次獲得鎖而不被阻塞,同時(shí)重入計(jì)數(shù)器繼續(xù)加1。當(dāng)線程退出鎖保護(hù)的代碼塊時(shí),計(jì)數(shù)器遞減,直到計(jì)數(shù)器降為0時(shí),鎖才被完全釋放。
下面是一個(gè)簡(jiǎn)單的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)用,測(cè)試ReentrantLock的可重入性 } finally { lock.unlock(); // 釋放鎖 } } public static void main(String[] args) { final ReentrantLockDemo demo = new ReentrantLockDemo(); // 創(chuàng)建兩個(gè)線程,同時(shí)調(diào)用increment()方法 new Thread(new Runnable() { public void run() { demo.increment(); } }).start(); new Thread(new Runnable() { public void run() { demo.increment(); } }).start(); } }
在這個(gè)例子中,我們創(chuàng)建了一個(gè)ReentrantLock對(duì)象來(lái)保護(hù)一個(gè)共享資源count,并在increment()方法中獲取鎖。在increment()方法中,我們遞歸調(diào)用increment()方法來(lái)測(cè)試ReentrantLock的可重入性。
運(yùn)行程序后,你會(huì)發(fā)現(xiàn)兩個(gè)線程會(huì)不斷遞歸調(diào)用increment()方法,每個(gè)線程會(huì)自己維護(hù)一個(gè)計(jì)數(shù)器。這就是ReentrantLock的可重入性的體現(xiàn),每個(gè)線程可以重復(fù)獲取鎖,而不會(huì)被阻塞。當(dāng)程序遞歸調(diào)用次數(shù)達(dá)到一定值時(shí),將會(huì)拋出StackOverflowError異常。
北京校區(qū)