[英]A thread does not access synchronized block
我在生產代碼中突然遇到了一個問題,這是最近5-6年以來從未發生過的。 我有一個線程池,最多可產生64個線程,並且所有64個線程都讀取一些數據並將其放在通用Map
以進行進一步處理。
讀取是由來自特定源的所有線程完成的,並且我已驗證確實從源中讀取了數據,但是,沒有將特定批處理放入Map
。
這是一個代碼段(由於機密性問題,無法放入完整的代碼):
try {
<read the data>
.
.
<do processing>
.
.
synchronized(glock) { //glock is a class attribute, Object glock = new Object[];
map.put(<data that was read>);
log.debug("bla bla bla")
}
} catch(Throwable e) {
log.error("error")
}
finally {
log.debug("done")
}
問題:特定線程未進入同步塊,未放入映射,未打印"bla bla bla"
,不打印"error"
但打印了"done"
。
我已經驗證了所有內容...代碼中沒有任何變化,這個問題立即從無處出現。 問題是,我不能放置任何其他日志,因為它是未經所有客戶同意的生產代碼。但這是最后一部分。
有沒有人遇到過類似的問題,或者對此一無所知? 讀取的數據量巨大,有6000條記錄,每條記錄至少具有0f 30-40列數據。
提前致謝。
編輯:捕獲Throwable
而不是Exception
從您向我們展示的內容來看,
synchronized(glock){}
在將數據放到地圖上而不是打印“ bla bla bla”時引發異常。
打印“ done”是因為它在try
的finally
一塊中。
您的代碼有99%的可能性出了點問題。 這意味着synchronized
塊中的代碼將引發異常,但是您看不到它。
常見的罪魁禍首是:
catch
塊會吞下異常(可以在代碼的其他地方) catch
塊中記錄器的異常日志配置,例如,將異常寫入另一個日志文件 log
不是標准的Java記錄器,而是其他東西。 您發現虛擬機中存在錯誤或硬件問題的可能性很小(<1%)。 如果您可以重復獲得相同的結果,則可能不是硬件問題。
如果其他所有操作均失敗,則需要在生產中調試問題。 當然,您的客戶會反對。 到那時,您將讓他們決定哪個對他們更重要:某些規則,您不得調試代碼或修復錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.