2013-08-04 116 views
4

我正在開發一個Java Spring MVC項目,並且我很猶豫在Java Spring Bean中使用實例變量。我想問一些關於這個主題的問題。Java Spring Bean中的實例變量

我在我的Java Spring Bean中使用了一個實例變量,它的類型是String。

private String abc = "hell"; 

正如我們所知,Java Spring默認範圍是Singleton,它們是在項目啓動時構建的。它是單實例,我的實例變量必須是線程安全的。

我在bean的方法中使用了這個變量「abc」,當它們被多個線程到達時,它會損害每個線程數據的一致性嗎?

例如,線程1到達bean並將abc變量改爲「hello」。那時,線程1引用abc變量point「hell」或「hello」?我很困惑這個話題。

我使字符串ABC變量ThreadLocal目的是提供每個線程持有自己的ABC variable.But我已閱讀,使用ThreadLocal對象時出現據說它是固定在Tomcat.After 7.0版的Tomcat存儲器泄漏。

因爲每個線程擁有自己的變量,當他們回到這是由container.But管理線程池,恢復池的作業完成,ThreadLocal的對象不被破壞,它們造成內存泄漏。

此外,String對象是不可變的,所以在理論視圖中它是否會導致多線程問題?

是每個線程都擁有自己的字符串變量嗎?例如,線程1觸發並啓動方法調用,並創建單獨的字符串變量「abc」和線程2觸發器,然後創建新的字符串變量「abc」,並相互損害「abc」變量?

我真的很想知道這個用法的概念,並且很想學習答案。

回答

4

我會嘗試單獨解決您的問題。

我用在豆的方法此變量abc並且當它們 由多個線程達到會損傷數據 每個線程的一致性?

簡短的回答這個問題是肯定的。如果您爲abc寫入了一個Thread的不同值,則可能會或可能不會從另一個線程看到。這就是引入volatile關鍵字的原因。

我要在Spring可變單豆類,那麼你需要小心的同步和使用volatile

數據將不會「損壞」,因爲正如您所指出的,String是不可變的。但有一個線程可能看不到另一個線程已更改abc的值。

所以你有一個變量abc;

  1. abc =「嗨。」
  2. 線程1將abc寫爲「Hi。」。
  3. 線程1通過寫入信號的變化abcabc="Hello."
  4. 線程2讀取abc,目前還不清楚是否abc讀「你好。」或「你好。」。

我使ABC的字符串變量ThreadLocal的目的是提供每個線程擁有自己的ABC變量

ThreadLocal用來讓每個線程被賦予一個變量的不同實例。這通常用於將狀態綁定到Web服務器中的線程,因爲Web服務器使用線程預先請求模型。

Tomcat 7 不會修復ThreadLocal泄漏問題。如果你不刪除你從線程設置的變量,那麼它會導致泄漏。或者更糟糕的是,請求會從另一個請求的上下文中獲取項目。當一個線程被檢入池並且其上下文在ThreadLocal中,然後被另一個請求檢出時,就會發生這種情況。

Tomcat 7輪胎檢測到這些問題,並換出線程來刪除它們的ThreadLocal變量。這很昂貴,可以通過正確使用ThreadLocal來避免。

您需要清除一個servlet過濾器中的ThreadLocal變量。

所以:

如果你有你想要寫在一個線程並不會被視爲在其他線程這種變化那麼你可以使用一個ThreadLocal變量abc,但你需要每次請求後都要非常小心地清除狀態。

如果你有一個變量abc喲想寫在一個線程,該更改待觀察在其他線程,那麼你可以使用一個singleton bean與volatile變量。

+0

我在一個方法中使用了ThreadLocal對象,並且此方法由JSP調用。方法的第一行從方法參數中取得ThreadLocal對象集的值。因此,「但是您需要非常小心地在每次請求後清除狀態。」我提供這個聲明,如果我理解正確,那麼沒問題。如果發生內存泄漏,我將爲servlet過濾器設置ThreadLocal對象。我是對吧? –

1

我想你的情況,如果你定義你的bean的範圍,它的實例變量爲Singleton應該做的。

根據Spring reference document,下面是Singleton作用域bean的定義。

To put it another way, when you define a bean definition and it is scoped as a singleton, 
the Spring IoC container creates exactly one instance of the object defined by that bean 
definition. This single instance is stored in a cache of such singleton beans, and all 
subsequent requests and references for that named bean return the cached object. 

Singleton是默認的範圍,你的bean將投產,如果你不指定。

此外,下面的語句應該牢記,如果您嘗試使用Spring的bean作用域的方式來處理您的案件。

This approach is powerful and flexible in that you can choose the scope of the objects 
you create through configuration instead of having to bake in the scope of an object at  
the Java class level. 
+0

這是如何回答OPs線程安全問題的? –

+0

@BoristheSpider與定義單個bean定義到任何數量的對象實例的'prototype'不同,'Singleton' scope將單個bean定義的範圍限定爲每個Spring IoC容器的單個對象實例。我正在用範圍創建的_object instances_的數量。 –

+0

首先感謝您的回覆Vikas V. 例如,線程1到達bean,並將abc變量改爲「hello」。那時,線程2引用abc變量point「hell」或「你好」?我很困惑這個話題。 –