ThreadStaticAttribute
类的静态字段在类的实例中是共享的。多个线程修改实例字段的值在对其它线程来说是可见的,这也是clr默认的行为。对静态字段添加ThreadStaticAttribute标记可以改变这种默认的行为。
ThreadStaticAttribute
指示静态字段的值对于每个线程都是唯一的。用 ThreadStaticAttribute 标记的 static 字段不在线程之间共享。每个执行线程都有单独的字段实例,并且独立地设置及获取该字段的值。如果在不同的线程中访问该字段,则该字段将包含不同的值。
分析
具有ThreadStatic标记的静态变量,在每个线程中都有自己的副本。
一般静态变量测试在进程之间共享的。
在WEB系统开发中,我们经常面对这样的需求:如何在一个请求中共享数据或对象实例?之前我都会用HttpContext.Current.Items。然而有一天我发现了两个事实:一、每个请求都是在一个线程中执行的;二、[ThreadStatic]可以标注某个静态字段为每个线程提供独立的存储。面对这两个发现,我得出了这个结论:可以用[ThreadStatic]替换HttpContext.Current.Items
不可以用[ThreadStatic]替换HttpContext.Current.Items。
WEB服务器用线程池执行每个请求,多个不同时段执行的请求还是会共享同一个线程。
张占岭 :线程池中的线程是可以被重用的,当你的请求结束后,当前线程结束,这时,其它客户端可能用你上次的线程!
---------------------------------------------------实例
[ThreadStatic] static int ThreadStaticValue; static int StaticValue; static Random r = new Random(); public static void ThreadProc() { StaticValue = ThreadStaticValue = r.Next(1, 10); while (true) { if (Thread.CurrentThread.Name == "Thread1") { StaticValue++; ThreadStaticValue++; } Console.WriteLine("{0}: ThreadStatic:{1}; Static:{2}", Thread.CurrentThread.Name, ThreadStaticValue, StaticValue); Thread.Sleep(500); } } static void Main(string[] args) { Thread t1 = new Thread(new ThreadStart(ThreadProc)); Thread t2 = new Thread(new ThreadStart(ThreadProc)); t1.Name = "Thread1"; t2.Name = "Thread2"; t1.Start(); t2.Start(); Console.WriteLine("Press Enter key to exit..."); Console.ReadLine(); Console.ReadKey(); }


浙公网安备 33010602011771号