Wednesday, December 22, 2010

ThreadStatic and ThreadLocal<T>

For a long time I was using the Thread­Sta­tic attribute to make the value of a sta­tic or instance field local to a thread (i.e. each thread holds an inde­pen­dent copy of the field). Although this did the trick for a long time, the ThreadStatic attribute had some disadvantages:

  • the Thread­Sta­tic attribute doesn’t work with instance fields, it com­piles and runs but does nothing..
  • fields always start with the default value

With the release of C#  4 Microsoft intro­duced a new class specif­i­cally for the thread-local stor­age of data – the ThreadLocal<T> class:

   1:   
   2:  ThreadLocal<int> _localField = new ThreadLocal<int>(() => 1); 
   3:   

So why should you choose the ThreadLocal<T> class?

  • Thanks to the use of a factory function, the val­ues are lazily eval­u­ated, the fac­tory func­tion only executes on the first call for each thread
  • you have more con­trol over the ini­tial­iza­tion of the field and you are able to ini­tial­ize the field with a non-default value

No comments: