NET问答: ThreadStatic 和 ThreadLocalT 哪一个更好 ?
生活随笔
收集整理的這篇文章主要介紹了
NET问答: ThreadStatic 和 ThreadLocalT 哪一个更好 ?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
咨詢區
user2341923:
[ThreadStatic] 被設計成特性, ThreadLocal<T> 被設計成泛型,為什么會有這兩種設計方案呢 ?誰能告訴我他們的優缺點各是什么?是不是泛型的方式更好一點?
回答區
Sanjeev:
[ThreadStatic] 背后的運作思路是為每個線程都copy一份變量的一個副本,參考如下代碼:
class?Program{[ThreadStatic]static?int?value?=?10;static?void?Main(string[]?args){value?=?25;Task?t1?=?Task.Run(()?=>{value++;Console.WriteLine("T1:?"?+?value);});Task?t2?=?Task.Run(()?=>{value++;Console.WriteLine("T2:?"?+?value);});Task?t3?=?Task.Run(()?=>{value++;Console.WriteLine("T3:?"?+?value);});Console.WriteLine("Main?Thread?:?"?+?value);Task.WaitAll(t1,?t2,?t3);Console.ReadKey();}}從上面的代碼片段可以看出:每個線程都有一個 value 的初始化副本,除了創建它的主線程。
如果你想對所有線程一視同仁或者有自己的初始化邏輯,這時候就可以用 ThreadLocal 了。
marai:
ThreadStatic 只會在創建它的線程中保留賦值,而 ThreadLocal 會將此賦值保留在所有線程中,比如我的簡單測試代碼。
class?Program{public?static?ThreadLocal<int>?_threadlocal?=?new?ThreadLocal<int>(()?=>?10);public?static?void?Main(){new?Thread(()?=>{Console.WriteLine("First?Thread:?{0}",?_threadlocal.Value);}).Start();new?Thread(()?=>{Console.WriteLine("Second?Thread:?{0}",?_threadlocal.Value);}).Start();Console.ReadKey();}}點評區
個人感覺 ThreadStatic 和 ThreadLocal 相比,前者算是一個簡單粗暴的版本,同時在用 ThreadStatic 時也要了解容易踩到的坑,比如 Sanjeev 大佬的例子中所述:value = 10 只會在創建它的線程中被保留,在其他線程中會被默認為初始值,如:value=0。
如果你想高度的定制化,可以采用 ThreadLocal ,畢竟你看那些鏈式跟蹤的框架都少不了它的蹤影。
總結
以上是生活随笔為你收集整理的NET问答: ThreadStatic 和 ThreadLocalT 哪一个更好 ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么?他居然想在DLL中放毒!
- 下一篇: WPF 命中测试HitTest