簡體   English   中英

Spring的@Lazy初始化線程安全嗎?

[英]Is Spring's @Lazy initialization thread-safe?

希望能回答一個簡單的問題。 我對此沒有找到任何絕對明確的答案。 任何人都可以提供可靠的消息來源。

我的普遍看法是,在不使用適當的同步塊的情況下,延遲加載在多線程應用程序中是危險的。 我想知道這是否適用於Spring。

謝謝。

我不知道Spring聲稱可以安全發布IoC容器管理的bean。

但是,快速瀏覽Bean工廠/應用程序上下文代碼將發現同步保護了許多關鍵位置(例如,注冊/注銷Bean定義,后處理階段等)。 請參見DefaultSingletonBeanRegistry中的許多方法具有同步塊。

關於延遲初始化的bean-我看到在DefaultSingletonBeanRegistry內部,構造由singletonObjects實例變量周圍的鎖保護。 此外,singletonObjects本身是並發哈希圖。

它使用雙重檢查鎖定(org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton()),因此可以安全地發布Bean。

除了線程安全性外,我還記得spring在初始發行版中曾有錯誤,並在版本中進行了改進,並注意:

1.singleton bean(惰性和非惰性)始終被完全實例化(包括init方法)並安全發布。 因此,它們的構造是線程安全的-如果另一個線程確實看到此bean,則它將永遠不會看到帶有某些字段默認值的半初始化單例

2.prototype bean的構造不是線程安全的,但是通常情況下,prototype bean不會在線程之間共享,並且如果必須的話,您必須自己確保將它們安全地發布到其他線程,此行為是框架要實現的

暫無
暫無

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

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