2017-06-06 61 views
-1

我有一個Spring應用程序,它將我的業務邏輯方法創建爲一個bean。ThreadLocal變量始終爲空

我的代碼如下所示:

public class MyClass { 
    private ThreadLocal<String> object1 = new ThreadLocal<String>(); 

    public String myMethodFoo(MyTestObject testobject) { 

     object1.set("Blah"); 
     ... 
     ... 
     ... 

     return object1.get(); 
    } 

} 

現在,當我運行我的單元測試,調用這個方法,我總是在這裏我設置的變量值即object1.set("Blah")行空指針異常。

但是當我將ThreadLocal對象聲明爲final時,它會奇蹟般地消失。 ThreadLocal對象是否總是被聲明爲最終的?

+3

請提供[mcve]。 –

+0

您的測試實際上是否運行多個線程?如果是這樣,你在一個線程中分配給object1並從多箇中讀取它;這是一場數據競賽。你需要確保讀取與寫入之前有正式的發生關係,並且我很容易做到這一點,即通過使變量最終成爲可能。 – yshavit

+0

不,我現在只用單線程來測試它,以瞭解它是如何工作的。當它僅向單個線程應用程序本身顯示空值時,我感到困惑。 – chrisrhyno2003

回答

1

不,ThreadLocal沒有將其定義爲final(同樣的規則,與其他變量適用於此),它可能是一些其他線程正在改變你的object1變量null

但是,ThreadLocal variables should be declared static因爲:

該類提供了線程局部變量。這些變量與它們的正常副本不同,它們與 不同,因爲訪問一個 (通過其get或set方法)的每個線程都有其自己的獨立初始化變量 副本。 ThreadLocal實例通常是私人的 類中想要將狀態與線程 (例如,用戶ID或交易ID)相關聯的靜態字段。