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()到的是那同一个共享对象,并发访问问题要靠其他手段来解决;
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()到的是那同一个共享对象,并发访问问题要靠其他手段来解决;
相关文章推荐
- vlc-android-macbuild
- Fluent NHibernate
- Permutation Sequence
- UIView如何管理它的子视图
- FlashBuilder 4.6 破解
- FCKEditor使用RequiredFieldValidator验证时必须点击两次的解决办法
- OC - KeyValue - 根据字典给模型赋值
- gc buffer busy acquire和gc buffer busy release原理及案例
- 详细整理:UITableView优化技巧
- Sublime Text Build 3080 License key
- UITableView 相关属性和方法
- IOS开发学习笔记036-UIScrollView-循环自动滚动
- Named query not known: *
- 解决NGUI与粒子系统的遮挡问题
- 2015baidu复赛 矩形面积(包凸 && ps:附quickhull模板)
- mysql插入中文时报错:incorrect string value
- easyUI的iframe子页面操作父页面元素
- hdu 2544最短路——最短路的初次总结 UESTC 6th Programming Contest Online
- 解读上海远丰MallBuilder商城系统的功能特性
- 自定义Cell的步骤