什麼就叫可重入鎖?
可重入鎖也叫可重複可遞歸調用的鎖,同一線程外層函數獲得鎖之後,在進入內層方法的時候會自動獲取鎖,然後使用,無需等待去再次獲取鎖,並且不發生死鎖(前提得是同一個對象或者class),這樣的鎖就叫做可重入鎖
代碼簡單實現,synchronized實現
public class TestLock {
public static synchronized void say() {
System.out.println(Thread.currentThread().getName()+"\t invoke say");
eat();
}
public synchronized static void eat() {
System.out.println(Thread.currentThread().getName()+"\t invoke eat");
}
public static void main(String[] args) {
new Thread(()->{
say();
},"t1").start();
new Thread(()->{
say();
},"t2").start();
}
}
打印結果
ReentrantLock實現
public class TestLock2 {
private static Lock lock = new ReentrantLock();
public static void say() {
try {
lock.lock();
System.out.println(Thread.currentThread().getName()+"\t invoke say");
eat();
} finally {
lock.unlock();
}
}
public static void eat() {
try {
lock.lock();
System.out.println(Thread.currentThread().getName()+"\t invoke eat");
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
new Thread(()->{
say();
},"t1").start();
new Thread(()->{
say();
},"t2").start();
}
}
打印結果
可以看到,當方法eat也需要鎖時,可以直接使用外層已經獲取到的鎖,而不用去等待重新獲取鎖。避免了去等待獲取鎖,從而造成死鎖問題。