黑马程序员技术交流社区

标题: ThreadLocal 与 Request 和 Session 之关联 [打印本页]

作者: sunrise2    时间: 2014-7-21 22:27
标题: ThreadLocal 与 Request 和 Session 之关联
         ThreadLocal<T> 类行是 .NET Framework 4.0 才开始支持的类型,MSDN 的解释只有简单的一句话:提供数据的线程本地存储,其提供的实例代码也不太好,有点为了演示而演示的目的。所以,一眼望去,我们并不知道这个类型有什么用。

一:ThreadLocal 在 .NET 中的表现
首先,两个类型在 API 声明上是不一致的,但是目的都是一样的:
让各个线程维持自己的变量。
现在,写一段代码测试下:

  1. public partial class Handler : System.Web.UI.Page
  2. {
  3.     private static ThreadLocal<Sample> sampLocal = new ThreadLocal<Sample>();
  4.     protected void Page_Load(object sender, EventArgs e)
  5.     {
  6.         if (!sampLocal.IsValueCreated)
  7.         {
  8.             sampLocal.Value = new Sample();
  9.         }
  10.         Response.Write("Thread.CurrentContext.ContextID=" + Thread.CurrentContext.ContextID + "<br/>");
  11.         Response.Write("Thread.CurrentThread.ManagedThreadId=" + Thread.CurrentThread.ManagedThreadId + "<br/>");
  12.         Response.Write("sampLocal=" + sampLocal.Value.GetHashCode() + "<br/>");
  13.     }
  14. }

  15. public class Sample
  16. {
  17. }
复制代码

其最有可能的输出是:

  1. Thread.CurrentContext.ContextID=0
  2. Thread.CurrentThread.ManagedThreadId=9
  3. sampLocal=57902434
复制代码

不停滴刷新,如果 threadid 为 9 ,则得到的 sampLocal 是同一个对象。

二:ThreadLocal  与 static

可以理解为
1:ThreadLocal 是线程内的 static 变量,也许其名字命名为 ThreadStatic 更好?
2:static 是全部线程都可共用的变量。


三:ThreadLocal 的用处

那么,这段代码为什么要这么设计,也许基于一点:

避免参数传递的访问方式,但是要注意get()到的是那同一个共享对象,并发访问问题要靠其他手段来解决。







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2