簡體   English   中英

Java:Exception類是線程安全的嗎?

[英]Java: is Exception class thread-safe?

據我所知,Java的Exception類肯定不是不可變的( initCausesetStackTrace等方法提供了一些線索)。 它至少是線程安全的嗎? 假設我的一個類有一個這樣的字段:

private final Exception myException;

我可以安全地將此字段暴露給多個線程嗎? 我不願意討論具體情況,以及為什么會出現這種情況。 我的問題更多的是關於這個原則:我可以告訴一個暴露Exception類型字段的類是線程安全的嗎?

另一個例子:

class CustomException extends Exception
{
   ...
}

這個類是線程安全的嗎?

請注意, initCause()synchronizedsetStackTrace()復制其參數,然后執行單個分配。

因此, Exception實際上似乎是在考慮線程安全的情況下實現的。 盡管如此,我還是要警惕任何在線程之間經常傳遞異常的設計(即除了處理非常嚴重的錯誤條件之外的任何原因)。 這只是感覺不對。

我相信安全發布Throwables / Exceptions是一個非常有效的問題。 DJClayworth的評論是“如果您在線程之間共享異常實例,那么您將其用於未設計的目的”並不考慮使用Futures的任務管理代碼。 工作線程通常會拋出異常,並且該異常需要由不同的線程處理。 除了上面提到Throwable的同步方法的所有注釋之外,Future還發布了線程之間的異常,因此我相信可以肯定地說這是預期的,安全的和支持的功能。

對於sun的java 6執行throwable

initCausesynchronized因此它的線程安全。 fillInStackTrace也是。

setStackTrace 不是 ,但它setStackTrace輸入進行防御性復制,然后分配該副本。 當然,該方法是“用於rpc框架”。

只要你的myException字段是final或volatile,就可以分享了。

我不相信Java Exception類提供任何線程安全保證。

檢測到條件時會拋出異常的目的,並在處理條件時捕獲它。 根據定義,這些應該在單個線程內發生。 如果您在線程之間共享一個Exception實例,那么您將其用於未設計的目的。 這樣做會讓您的讀者感到困惑,並使您的程序難以維護。 您可能應該考慮使用它的替代結構。

暫無
暫無

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

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