帶有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 }
注:該字段依賴當前線程,當線程池的線程被重用時,可能該字段又表現為“公用”的了。及時清空可以一定程度上解決該問題。