Java中鎖的應用是實現多線程編程的基礎,其中可重入鎖和遞歸鎖都是比較重要的概念。它們分別解決了線程重復獲取已經獲取過的鎖和嵌套鎖的問題。
可重入鎖是指可以重復獲取同一把鎖,例如當一個線程已經持有某個鎖時,它可以再次獲取該鎖而不會被阻塞。這種鎖的實現需要一個計數器來記錄獲取鎖的次數,在釋放鎖時需要進行相應的減少操作,當計數器為0時才真正釋放該鎖。Java中的ReentrantLock就是一個典型的可重入鎖的例子。
public class ReentrantLockTest { private static final Lock lock = new ReentrantLock(); public static void main(String[] args) { lock.lock(); try { System.out.println(Thread.currentThread().getName() + "獲取了鎖"); lock.lock(); try { System.out.println(Thread.currentThread().getName() + "再次獲取了鎖"); } finally { lock.unlock(); System.out.println(Thread.currentThread().getName() + "釋放了鎖"); } } finally { lock.unlock(); System.out.println(Thread.currentThread().getName() + "釋放了鎖"); } } }
遞歸鎖是指同一個線程在持有鎖的情況下,可以再次獲取該鎖。例如當一個線程在已經持有某個鎖的情況下,它又要獲取一個同樣的鎖,這個時候它不會被阻塞。Java中的Synchronized關鍵字就是一個典型的遞歸鎖的例子。
public class SynchronizedTest { public static synchronized void test() { System.out.println(Thread.currentThread().getName() + "獲取了鎖"); test2(); } private static synchronized void test2() { System.out.println(Thread.currentThread().getName() + "再次獲取了鎖"); } public static void main(String[] args) { test(); } }
可重入鎖和遞歸鎖都是用來解決線程同步問題的常用手段,能夠避免死鎖的發生,提高線程的效率和可靠性。在Java中,我們可以通過ReentrantLock和Synchronized這兩種方式來實現可重入鎖和遞歸鎖。