2010-04-08 34 views
2

我在追蹤一個間歇性足以成爲真正的bastich的生產缺陷,可以正確診斷,但頻繁程度足以成爲我們客戶的合法滋擾。雖然我正在等待它在一臺機器上再次發生跟蹤輸出的日誌文件,我試圖想出一個可能的理論。競爭文件訪問可能導致Java死鎖嗎?

是否有任何方式競爭文件讀/寫來創建相當於死鎖條件的東西?例如,假設我有偶爾寫入config.xml的線程A,偶爾讀取它的線程B。是否有一組情況會導致線程B阻止線程A繼續進行?

我要感謝任何人幫助這個理論性的釣魚探險。

編輯:要回答Pyrolistical的問題:代碼沒有使用FileLock,並且運行在WinXP機器上。沒有問,但可能值得注意的是:生產機器運行Java 1.5。

+1

你知道線程堆棧掛起時的樣子嗎?您可以使用jvisualvm附加到掛起的jvm並轉儲線程堆棧。 – 2010-04-08 18:28:46

+3

你使用'FileLock'嗎?如果不是,那麼我認爲你會得到部分讀取或錯誤,但從來沒有死鎖。這也是操作系統和FS所依賴的 – Pyrolistical 2010-04-08 18:29:00

+0

@Devon:不,我不知道。我對jvisualvm不熟悉,但基於對Google的快速訪問,這顯然是我需要糾正的問題,謝謝! @Pyrolistical:不,不使用FileLock,代碼在WinXP下運行。 – BlairHippo 2010-04-08 18:42:49

回答

0

我已經得到了追逐潛在的bug一些有用的提示,但基於我已經得到了迴應,似乎正確答案的實際問題是:

媽。這是反高潮。

2

暫時設置你的生產過程中啓動了支持調試,將它添加到你是如何開始你的Java程序或者說Tomcat啓動:

-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n 

然後附加到它:

jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000 

然後看看你的堆棧。

0

FileLock是一個進程間鎖定機制。它在同一個JVM中沒有做任何事情,所以不是這樣。我會看看你的同步,特別是確保你總是以相同的順序獲取多個鎖。

0

我知道這是舊的,但添加一些清晰度上一個「否」的回答(對於我們這些誰需要知道爲什麼):

死鎖發生時,正好有兩個不同的過程(交易)更新替代的依賴行或記錄,但順序相反。基本上都是等待對方完成永不會發生的動作(因爲他們都在等待)。這通常發生在錯誤的數據庫設計中。

如果我還記得,維基百科有這裏一個很好的定義:http://en.wikipedia.org/wiki/Deadlock

簡單的文件訪問不應該建立這樣的依賴關係。更常見的問題是您的資源正在被另一個進程使用,並且試圖訪問它的那個資源不可用。