可重入鎖,指的就是在一段同步代碼塊中,同一個鎖只能同時被一個線程所持有,所以當一個線程執行一段同步代碼塊的時候,從a方法進入到b方法,會自動獲取鎖,而不會被其他的線程所搶佔。
private static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
new Thread(() -> {
a();
}, "我是線程1").start();
new Thread(() -> {
b();
},"我是線程2").start();
}
private static void a(){
lock.lock(); // 獲取鎖
System.out.println(Thread.currentThread().getName()+"a.....");
try {
Thread.sleep(2000);
b(); //調用b方法
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.unlock(); // 釋放鎖
}
private static void b(){
lock.lock(); //獲取鎖
System.out.println(Thread.currentThread().getName()+"b.....");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.unlock(); //釋放鎖
}
執行結果爲:
我是線程1a.....
我是線程1b.....
我是線程2b.....
Process finished with exit code 0