ThreadStatic特性

  带有threadStaticAttribute标记的静态字段在线程之间不共享。每个执行线程都有一个单独的字段实例,并独立地设置和获取该字段的值。如果在不同的线程上访问该字段,则它将包含不同的值。除了将threadStaticAttribute属性应用于字段之外,还必须将其定义为静态字段(在C中)或共享字段(在Visual Basic中)。不要为标记为threadStaticAttribute的字段指定初始值,因为此类初始化仅在类构造函数执行时发生一次(静态构造函数),因此只影响一个线程。

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             TestStaticThread TestStaticThread1 = new TestStaticThread();
 6             TestStaticThread TestStaticThread2 = new TestStaticThread();
 7 
 8             //Thread1
 9             Thread thread1 = new Thread(TestStaticThread1.SetStatic);
10             thread1.Start();
11 
12             //Thread2
13             Thread thread2 = new Thread(TestStaticThread2.GetStatic);
14             thread2.Start();
15 
16             Console.Read();
17         }
18     }
19 
20     public class TestA
21     {
22         public Guid Guid { get; set; }
23     }
24 
25     public class TestStaticThread
26     {
27         //指示各线程的静态字段值是否唯一
28         //依赖当前线程,独立于其它线程
29         [ThreadStatic]
30         private static TestA A;
31 
32         static TestStaticThread()
33         {
34             A = new TestA();
35             A.Guid = Guid.NewGuid();
36             Console.WriteLine("Default:" + A.Guid);
37         }
38 
39         public TestStaticThread()
40         {
41             Console.WriteLine("Constructor:" + A.Guid);
42         }
43 
44         public void SetStatic(object o)
45         {
46             A = new TestA();
47             A.Guid = Guid.NewGuid();
48             Console.WriteLine("SetStatic:" + A.Guid);
49         }
50 
51         public void GetStatic(object o)
52         {
53             if (A != null)
54             {
55                 Console.WriteLine("GetStatic:" + A.Guid);
56             }
57             else
58             {
59                 Console.WriteLine("GetStatic:A Is Null.");
60             }
61         }
62     }

  注:该字段依赖当前线程,当线程池的线程被重用时,可能该字段又表现为“公用”的了。及时清空可以一定程度上解决该问题。

posted on 2019-06-10 14:10  庭前花满留晚照  阅读(2328)  评论(1编辑  收藏  举报

导航