首頁 >Java >java教程 >java並發學習之什麼是死鎖?死鎖的介紹

java並發學習之什麼是死鎖?死鎖的介紹

青灯夜游
青灯夜游轉載
2018-10-22 17:48:132662瀏覽

本篇文章帶給大家的內容是java並發學習之什麼是死鎖?死鎖的介紹。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。   

  • 死鎖的介紹:
    鎖定是一個非常有用的工具,運作場景非常多,因為它使用起來非常簡單,而且很容易理解。但同時它也會帶來一些困擾,例如死鎖問題。例如有兩個執行緒A和B,運行都需要兩個資源a,b。 A取得了a資源,B取得了b資源,接著A去請求b資源,B去請求a資源,兩個執行緒互相阻塞產生死鎖。

  • 程式碼範例:

public calss DeadLockDemo{
	private static String A = "A";
	private static String B = "B";
	public static void main(String[] args){
		new DeadLockdemo().deadLock();
	}
	private void deadLock(){
		Thread t1 = new Thread(new Runnable(){
			@Override
			public void run(){
				synchronized(A){
					try{
						Thread.currentThread().sleep(2000);
					}catch(Exception e){
					  e.printStackTrace();
					 }
					 synchronized(B){
					 	System.out.println("B");
					 }
				}
			}
		});
		Thread t2 = new Thread(new Runnable(){
			@Override
			public void run(){
				synchronized(B){
					try{
						Thread.currentThread().sleep(2000);
					}catch(Exception e){
					  e.printStackTrace();
					 }
					 synchronized(A){
					 	System.out.println("A");
					 }
				}
			}
		});
		t1.start();
		t2.start();
	}
}

上述程式碼執行後會發生死鎖,t1和t2互相阻塞。

  • 死鎖產生的場景分析:
    在一個更為複雜的場景中,你可能會遇到這樣的問題,t1拿到鎖之後,因為一些例外狀況而沒有釋放鎖(死循環)。或是t1拿到了一個資料庫鎖,釋放鎖的時候拋出了異常沒釋放掉。

  • 避免死鎖的幾種方法:
    1.盡量避免一個執行緒同時取得多個鎖定。
    2.盡量避免一個執行緒同時佔據多個支援,盡量一個執行緒同時只佔據一個資源。
    3.嘗試使用定時鎖定。 Lock.tryLock(timeout)來取代使用內部鎖定機制。
    4.對於資料庫鎖,加鎖和解鎖必須在一個資料庫連線裡進行。

#

以上是java並發學習之什麼是死鎖?死鎖的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除