zoukankan      html  css  js  c++  java
  • ThreadLocal 与 Request 和 Session 之关联

    ThreadLocal<T> 类行是 .NET Framework 4.0 才开始支持的类型,MSDN 的解释只有简单的一句话:提供数据的线程本地存储,其提供的实例代码也不太好,有点为了演示而演示的目的。所以,一眼望去,我们并不知道这个类型有什么用。

    一:ThreadLocal 在 JAVA 中的应用

    其实这个类型在 JAVA 中早就存在了,并且在 JAVA 的体系中的应用也被广泛提到,现在我们把这些概念用 .NET 来描述一遍。

    先看段 JAVA 代码,这端代码存在于 Hibernate 中:

    private static final ThreadLocal threadSession = new ThreadLocal();  
    public static Session getSession() throws InfrastructureException {  
        Session s = (Session) threadSession.get();  
        try {  
            if (s == null) {  
                s = getSessionFactory().openSession();  
                threadSession.set(s);  
            }  
        } catch (HibernateException ex) {  
           throw new InfrastructureException(ex);  
        }  
        return s;  
    }

    要看懂或者明白这段代码的意义,我们需要了解一般 WEB应用服务器 关于对于 Request 和 Thread 的处理:

    一次请求会产生一个 Thread 吗?不会,WEB引擎(如ASP.NET 引擎)会维护一个托管线程池,多次请求间可能会用到一个线程(PS:严格意义上来说,是异步,不是线程,但包装成托管线程的模样)。

    接着继续说代码:首先判断当前线程中有没有放进去 session ,如果还没有,那么通过 sessionFactory().openSession() 来创建一个 session ,再将 session set 到线程中,实际是放到当前线程的 ThreadLocal 对象上。要注意的是,其他线程中是取不到这个 session 的

    二: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()到的是那同一个共享对象,并发访问问题要靠其他手段来解决;

    参考:ThreadLocal

  • 相关阅读:
    D3D中的Alpha颜色混合(1)
    最小的MFC程序
    命名空间规则【内部】
    能登陆QQ,打不开网页
    .net重要的开源组件[更新中]
    validateRequest="false"属性及xss攻击
    RSS介绍
    Virtual、Override和New关键字的使用
    SQL语句精妙集合
    绝好的软件集合
  • 原文地址:https://www.cnblogs.com/luminji/p/3769719.html
Copyright © 2011-2022 走看看