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

ThreadLocal 与 Request 和 Session 之关联的更多相关文章

  1. 【Spring】Spring IOC原理及源码解析之scope=request、session

    一.容器 1. 容器 抛出一个议点:BeanFactory是IOC容器,而ApplicationContex则是Spring容器. 什么是容器?Collection和Container这两个单词都有存 ...

  2. struts 在Action中访问web元素(request,session等)

    出发jsp: <?xml version="1.0" encoding="GB18030" ?> <%@ page language=&quo ...

  3. Request获取Session的两种方式

    1.无请求参数 public HttpSession getSession() 获取当前request关联的session,如果当前request没有session,创建一个session. 2.有请 ...

  4. struts2在action中获取request、session、application,并传递数据

    假设仅仅是通过request.session.application传递数据,则不须要获取对应的对象也能够传递数据,代码例如以下: ScopeAction.java: package com.ithe ...

  5. Request与session与application的区别

    (1)request的setAttribute与getAttribute方法一般都是成对出现的,首先通过setAttribute方法设置属性与属性值,然后通过getAttribute方法根据属性获取到 ...

  6. web初学之request,session与application

    request (1)request的setAttribute()与getAttribute()方法一般都是成对出现,首先通过setAttribute()方法设置属性与属性值,然后通过getAttri ...

  7. strut2的拦截器之对request和session的封装

    本文主要内容是对  implements Interceptor 这种方式的探索 前提是需要了解:责任链模式 对下面这句代码的理解: Map<String, Object> session ...

  8. struts2获得request和session对象

    在struts1中,获得到系统的request或者session对象非常方便,都是按照形参传递的,但是在struts2中,request和session都被隐藏了 struts2提供两种方式访问ses ...

  9. servlet三大作用域:request,session,application

    javaweb开发中Servlet三大域对象的应用(request.session.application(ServletContext)). 1. request request是表示一个请求,只要 ...

随机推荐

  1. sqrt

    sqrt特别慢,两边同时平方,尽量避免开方.

  2. JavaWeb中Tomcat与Eclipse的集成—步骤详解

    前面会简单介绍,下翻Tomcat与Eclipse的集成 一.先介绍一下应用程序的结构: 1.到目前为止应用程序物理结构有两种: C/S——Client / server:这种结构的应用,客户端与服务端 ...

  3. 使用eclipse svn塔建(配置)时的一点点心得

    有没有人遇到下面这种情况??自己创建的SVN如下: 但网上别人搭建好的是这样子的: 就是为什么我的只有个主文件,而没有src.webroot.meta-inf.web-inf等子文件呢?? 这是我找了 ...

  4. 命名和目录接口 JNDI-The Java Naming and Directory Interface

    命名和目录接口 JNDI-The Java Naming and Directory Interface JNDI (The Java Naming and Directory Interface)为 ...

  5. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.感谢 在此感谢.net ...

  6. Loj10154 选课

    试题描述: 大学实行学分制.每门课程都有一定的学分,学生只要选修了这门课并通过考核就能获得相应学分.学生最后的学分是他选修各门课的学分总和.每个学生都要选择规定数量的课程.其中有些课程可以直接选修,有 ...

  7. Codeforces Round #396 (Div. 2) A. Mahmoud and Longest Uncommon Subsequence 水题

    A. Mahmoud and Longest Uncommon Subsequence 题目连接: http://codeforces.com/contest/766/problem/A Descri ...

  8. Codeforces Round #511 (Div. 2)

    Codeforces Round #511 (Div. 2) #include <bits/stdc++.h> using namespace std; int n; int main() ...

  9. px 与 dp, sp换算公式?(转)

    PPI = Pixels per inch,每英寸上的像素数,即 "像素密度" xhdpi: 2.0 hdpi: 1.5 mdpi: 1.0 (baseline) ldpi: 0. ...

  10. CENTOS下搭建SVN服务器(转)

    1.安装svn yum install -y subversion 2.验证安装是否成功 svnserve --version 3.创建svn版本库 mkdir svn svnadmin create ...