簡體   English   中英

線程無法訪問同步塊

[英]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”是因為它在tryfinally一塊中。

您的代碼有99%的可能性出了點問題。 這意味着synchronized塊中的代碼將引發異常,但是您看不到它。

常見的罪魁禍首是:

  • 空的catch塊會吞下異常(可以在代碼的其他地方)
  • catch塊中記錄器的異常日志配置,例如,將異常寫入另一個日志文件
  • 由於某種原因,日志消息未按順序寫入(因此,ERROR行不在您期望的位置)
  • 某些異常情況(例如內存不足)加上有彈性的代碼阻止了日志消息的寫入。 地圖可能需要驚人的內存量。
  • log不是標准的Java記錄器,而是其他東西。

您發現虛擬機中存在錯誤或硬件問題的可能性很小(<1%)。 如果您可以重復獲得相同的結果,則可能不是硬件問題。

如果其他所有操作均失敗,則需要在生產中調試問題。 當然,您的客戶會反對。 到那時,您將讓他們決定哪個對他們更重要:某些規則,您不得調試代碼或修復錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM