ThreadLocal<T> 类行是 .NET Framework 4.0 才开始支持的类型,MSDN 的解释只有简单的一句话:提供数据的线程本地存储,其提供的实例代码也不太好,有点为了演示而演示的目的。所以,一眼望去,我们并不知道这个类型有什么用。
一:ThreadLocal 在 .NET 中的表现
首先,两个类型在 API 声明上是不一致的,但是目的都是一样的:
让各个线程维持自己的变量。
现在,写一段代码测试下:
- public partial class Handler : System.Web.UI.Page
- {
- private static ThreadLocal<Sample> sampLocal = new ThreadLocal<Sample>();
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!sampLocal.IsValueCreated)
- {
- sampLocal.Value = new Sample();
- }
- Response.Write("Thread.CurrentContext.ContextID=" + Thread.CurrentContext.ContextID + "<br/>");
- Response.Write("Thread.CurrentThread.ManagedThreadId=" + Thread.CurrentThread.ManagedThreadId + "<br/>");
- Response.Write("sampLocal=" + sampLocal.Value.GetHashCode() + "<br/>");
- }
- }
- public class Sample
- {
- }
复制代码
其最有可能的输出是:
- Thread.CurrentContext.ContextID=0
- Thread.CurrentThread.ManagedThreadId=9
- sampLocal=57902434
复制代码
不停滴刷新,如果 threadid 为 9 ,则得到的 sampLocal 是同一个对象。
二:ThreadLocal 与 static
可以理解为
1:ThreadLocal 是线程内的 static 变量,也许其名字命名为 ThreadStatic 更好?
2:static 是全部线程都可共用的变量。
三:ThreadLocal 的用处
那么,这段代码为什么要这么设计,也许基于一点:
避免参数传递的访问方式,但是要注意get()到的是那同一个共享对象,并发访问问题要靠其他手段来解决。
|
|