Similar to Lazy, ThreadLocal
creates object local to one thread. So each individual thread will have its own Lazy initializer object and hence will create the object multiple times once for each thread. In .NET 3.5 or before, you can create objects that are local to one thread using ThreadStatic
attribute. But sometimes ThreadStatic
fails to create a truely ThreadLocal
object. Basic static initializer is initialized for once, in case of ThreadStatic
class.
ThreadLocal
creates a wrapper of Lazy and creates a truly ThreadLocal object. Lets look into code how to build a ThreadLocal object.
public void CreateThreadLocal() { ThreadLocal<List<float>> local = new ThreadLocal<List<float>>(() => this.GetNumberList(Thread.CurrentThread.ManagedThreadId)); Thread.Sleep(5000); List<float> numbers = local.Value; foreach (float num in numbers) Console.WriteLine(num); } private List<float> GetNumberList(int p) { Random rand = new Random(p); List<float> items = new List<float>(); for(int i = 0; i<10;i++) items.Add(rand.Next(); return items; } [/code] In the above methods, the <code>CreateThreadLocal </code>creates a local thread and takes the lazy object GetNumberList when the Value is called for (just like normal <code>Lazy </code>implementation). Now if you call <code>CreateThreadLocal </code>using the code below, each of the Threads you create will hold its own List itself. [code] Thread newThread = new Thread(new ThreadStart(this.CreateThreadLocal)); newThread.Start(); Thread newThread2 = new Thread(new ThreadStart(this.CreateThreadLocal)); newThread2.Start();
Remember, ThreadStatic objects has Thread affinity.
Hope this tip helps you
Thanks for reading.