java可重入鎖synchronized和ReentrantLock

什麼就叫可重入鎖?
可重入鎖也叫可重複可遞歸調用的鎖,同一線程外層函數獲得鎖之後,在進入內層方法的時候會自動獲取鎖,然後使用,無需等待去再次獲取鎖,並且不發生死鎖(前提得是同一個對象或者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也需要鎖時,可以直接使用外層已經獲取到的鎖,而不用去等待重新獲取鎖。避免了去等待獲取鎖,從而造成死鎖問題。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章