簡體   English   中英

彈簧注射 - 螺紋安全

[英]Spring Injection - Thread safe

public class Test{
private First first;
private Second second;

public void setFirst(First first){
this.first = first;
}
public First getFirst(){
 return first;
}
// same approach for second
}

如果我通過彈簧注射注入實例,它是否是線程安全的? 如果沒有,如何使其線程安全? 我用谷歌搜索並發現矛盾的回答,無法得出任何結論。請建議。 提前致謝。 -RW

如果你在談論我認為你在談論的內容,那么這是一個有趣的討論。

從技術上講 ,因為setFirst()getFirst()synchronized ,那么它可能 setFirst()對線程1注入一個對象, getFirst()對線程2返回不同的對象的Java內存模型保留的權利正如他們所說,使這“最終保持一致”。

因此,在啟動期間(或服務器的內部啟動線程)配置其bean圖的Spring的情況下,由於缺乏同步,HTTP請求線程(例如)可能無法正確地看到該bean圖。

注意:這與並發訪問無關。 即使在Spring初始化之后進入HTTP請求,Java內存模型也不能保證這些線程會看到正確的數據。

在實踐中,這種情況從未發生過(至少,我從未見過它)。 缺少同步只是並發線程的一個問題,這不是問題。

所以這真的只是一個學術論點。

如果這不是你所說的話,我道歉。 不過,這仍然是一個有趣的想法。

注入依賴項是由Spring處理的,你不應該關心getter和setter的線程安全性,因為Spring會考慮到你沒有同步邏輯而注入依賴項。

此外,在完全配置上下文並注入所有依賴項之前,沒有其他線程(即應用​​程序的線程)將使用bean。

你不應該擔心依賴注入的線程安全性,Spring會這樣做(最有可能的是,spring只使用一個線程來注入所有依賴項)。

假設您已創建Test單例實例並嘗試從Spring程序的另一部分設置/獲取Spring(b)中的值(a)。 在這種情況下,只需使您的get / set對同步:

public synchronized void setFirst(First first){
    this.first = first;
}
public synchronized First getFirst(){
    return first;
}

我沒有看到多線程的其他不安全因素

暫無
暫無

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

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