2017-06-06 5 views
-1

J'ai une application Spring qui crée ma méthode de logique métier en tant que bean.La variable ThreadLocal est toujours nulle

Mon code ressemble:

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

    public String myMethodFoo(MyTestObject testobject) { 

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

     return object1.get(); 
    } 

} 

Maintenant, quand je lance mon test unitaire qui appelle cette méthode, je reçois toujours une exception de pointeur nul sur la ligne où je mets la valeur de la variable i.e. object1.set("Blah").

Mais de toute façon, il disparaît comme par magie lorsque je déclare l'objet ThreadLocal final. Les objets ThreadLocal doivent-ils toujours être déclarés définitifs?

+3

Veuillez fournir un [mcve]. –

+0

Votre test exécute-t-il plusieurs threads? Si c'est le cas, vous assignez à object1 dans un thread et vous lisez à partir de multiple; c'est une course de données. Vous devez vous assurer que les lectures ont une relation formelle avec l'écriture, et je peux facilement le faire en définissant la variable finale. – yshavit

+0

Eh bien non, je le teste seulement en utilisant un seul thread pour maintenant comprendre comment cela fonctionne. J'étais confus quand il m'a montré des valeurs nulles seulement avec une seule application filetée elle-même. – chrisrhyno2003

Répondre

1

Non, ThreadLocal ne doit pas être défini comme final (mêmes règles que les autres variables appliquent ici) et il est possible qu'un autre thread est en train de changer votre variable object1 à null.

Cependant, ThreadLocal variables should be declared static parce que:

Cette classe fournit des variables locales de thread. Ces variables diffèrent de leurs homologues normales en ce que chaque thread qui accède à un (via sa méthode get ou set) a sa propre copie initialisée indépendamment de la variable. ThreadLocal des instances sont généralement des champs statiques privés dans des classes qui souhaitent associer un état à un fil (par exemple, un ID utilisateur ou un ID de transaction).