2011-02-15 104 views
3
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 
} 

如果我通過彈簧注入注入實例,它是線程安全的嗎?如果沒有,如何使它線程安全?我GOOGLE了,發現矛盾的反應,無法得出任何結論。請建議。 在此先感謝。 -RW彈簧注射 - 線程安全

+8

你的問題太含糊。你什麼意思?給出更好的例子,爲什麼你認爲它可能不是線程安全的。 – skaffman 2011-02-15 10:58:39

+0

請澄清你的問題。你展示的這個類總是線程安全的,因爲它不允許任何訪問它的狀態(除了用`setAccessible()`來骯髒的黑客)。 – axtavt 2011-02-15 10:59:40

+1

回答信息不足。 – 2011-02-15 11:00:19

回答

-1

假設您創建了單例實例Test並試圖從Spring程序的另一部分設置/獲取值(a)。 在這種情況下,只是讓你的get/set方法對同步:

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

我沒有看到多線程

+1

像這樣同步你的方法是你能做的最糟糕的事情。首先,你沒有保護你的這一點。首先以任何方式,你只是確保一次只有一個線程可以進入setFirst和getFirst方法,這是毫無意義的。 – Spajus 2011-02-15 11:27:32

5

如果你在說些什麼,我認爲你是在談論其他不安全,那麼它的一個有趣的討論。

技術上,因爲setFirst()getFirst()不​​,那麼它的可能setFirst()注入對線程1一個對象,getFirst()對線程2返回不同的對象的Java內存模型保留的權利就像他們所說的那樣,使這個「最終一致」。

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

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

在實踐中,這從來沒有發生過(至少,我從來沒有見過它發生)。缺少同步對併發線程來說只是一個問題,這不是問題。

所以這實際上只是一個學術論證。

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

0

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

此外,沒有其他線程(即您的應用程序的線程)將使用這些bean,直到上下文完全配置並且所有依賴關係都被注入爲止。你不應該擔心依賴注入的線程安全性,Spring會(很可能,Spring將只使用一個線程來注入所有的依賴關係)。