七 多執行緒程式設計10 執行緒死鎖

2022-08-26 20:27:13 字數 1157 閱讀 7464

需要避免的與多工處理有關的特殊錯誤型別是死鎖(deadlock)。死鎖發生在當兩個執行緒對一對同步物件有迴圈依賴關係時。例如,假定乙個執行緒進入了物件x的管程而另乙個執行緒進入了物件y的管程。如果x的執行緒試圖呼叫y的同步方法,它將像預料的一樣被鎖定。而y的執行緒同樣希望呼叫x的一些同步方法,執行緒永遠等待,因為為到達x,必須釋放自己的y的鎖定以使第乙個執行緒可以完成。死鎖是很難除錯的錯誤,因為:

為充分理解死鎖,觀察它的行為是很有用的。下面的例子生成了兩個類,a和b,分別有foo( )和bar( )方法。這兩種方法在呼叫其他類的方法前有乙個短暫的停頓。主類,名為deadlock,建立了a和b的例項,然後啟動第二個執行緒去設定死鎖環境。foo( )和bar( )方法使用sleep( )強迫死鎖現象發生。

// an example of deadlock.

class a catch(exception e)

system.out.println(name + " trying to call b.last()");

b.last();

}synchronized void last()

}class b catch(exception e)

system.out.println(name + " trying to call a.last()");

a.last();

}synchronized void last()

}class deadlock implements runnable

public void run()

public static void main(string args)

}執行程式後,輸出如下:

mainthread entered a.foo

racingthread entered b.bar

mainthread trying to call b.last()

racingthread trying to call a.last()

因為程式死鎖,你需要按ctrl-c來結束程式。在pc機上按ctrl-break(或在solaris下按ctrl-\)你可以看到全線程和管程緩衝堆。你會看到racingthread在等待管程a時占用管程b,同時,mainthread占用a等待b。該程式永遠都不會結束。像該例闡明的,你的多執行緒程式經常被鎖定,死鎖是你首先應檢查的問題。

多執行緒程式設計之執行緒死鎖問題

在多執行緒程式設計中,除了要解決資料訪問的同步與互斥之外,還需要解決的重要問題就是多執行緒的死鎖問題。所謂死鎖 是指兩個或兩個以上的程序 執行緒 在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外部處理作用,它們都將無限等待下去。一 死鎖原因與形成條件 死鎖形成的原因 系統資源不足 程序 執...

七 多執行緒程式設計5 建立多執行緒

到目前為止,我們僅用到兩個執行緒 主線程和乙個子執行緒。然而,你的程式可以建立所需的更多執行緒。例如,下面的程式建立了三個子執行緒 create multiple threads.class newthread implements runnable this is the entry point ...

多執行緒死鎖

這段時間剛好學到多執行緒,下面是自己對死鎖的一些感悟,並不是我說的有多到位,只是想到一種更為通俗易懂理解方式,現在和大家一起分享一下,有改進的地方,希望大家多提提意見。一 首先說一下死鎖的定義 由兩個或兩個以上的執行緒由於互相競爭資源,導致一種互相等待的狀態,如果沒有外力推動,則他們都無法進行下去。...