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();
        }

 

 

 

 

posted @ 2016-09-21 17:58  wjl910  阅读(172)  评论(0)    收藏  举报