您的位置:首页 > 产品设计 > UI/UE

ThreadLocal 与 Request 和 Session 之关联

2015-06-02 09:22 501 查看
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()到的是那同一个共享对象,并发访问问题要靠其他手段来解决;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: