• 在各种Session 管理方案中, ThreadLocal 模式得到了大量使用。ThreadLocal 是

    Java中一种较为特殊的线程绑定机制。通过ThreadLocal存取的数据,总是与当前线程相关。

    也就是说,JVM 为每一个执行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出

    现的并发訪问问题提供了一种隔离机制。

    首先,我们须要知道。SessionFactory负责创建Session,SessionFactory是线程

    安全的,多个并发线程能够同一时候訪问一个SessionFactory 并从中获取Session 实例。而

    Session并不是线程安全,也就是说。假设多个线程同一时候使用一个Session实例进行数据存取。

    则将会导致Session 数据存取逻辑混乱。

    以下是一个典型的Servlet,我们试图通过一个类

    变量session实现Session的重用,以避免每次操作都要又一次创建:

    public class TestServlet extends HttpServlet {

    private Session session;

    public void doGet( HttpServletRequest request,

    HttpServletResponse response)

    throws ServletException, IOException {

    session = getSession();

    doSomething();

    session.flush();

    }

    public void doSomething(){

    ......//基于session的存取操作

    }

    }

    代码看上去正确无误,甚至在我们单机測试的时候可能也不会发生什么问题。但这种代

    Hibernate Developer’s Guide Version 1.0

    September 2, 2004 So many open source projects. Why not Open your Documents?

    码一旦编译部署到实际执行环境中,接踵而来的莫名其妙的错误非常可能会使得我们摸不找头脑。

    问题出在哪里?

    首先,Servlet 执行是多线程的,而应用server并不会为每一个线程都创建一个Servlet

    实例,也就是说,TestServlet在应用server中仅仅有一个实例(在Tomcat中是这样,其它的

    应用server可能有不同的实现),而这个实例会被很多个线程并发调用,doGet 方法也将被不

    同的线程重复调用,可想而知,每次调用doGet 方法,这个唯一的TestServlet 实例的

    session 变量都会被重置,线程A 的执行过程中,其它的线程假设也被执行,那么session

    的引用将发生改变。之后线程A 再调用session。可能此时的session 与其之前所用的

    session就不再一致,显然,错误也就不期而至。

    ThreadLocal的出现,使得这个问题迎刃而解。

    我们对上面的样例进行一些小小的改动:

    public class TestServlet extends HttpServlet {

    private ThreadLocal localSession = new ThreadLocal();

    public void doGet( HttpServletRequest request,

    HttpServletResponse response)

    throws ServletException, IOException {

    localSession.set(getSession());

    doSomething();

    session.flush();

    }

    public void doSomething(){

    Session session = (Session)localSession.get();

    ......//基于session的存取操作

    }

    }

    能够看到,localSession 是一个ThreadLocal 类型的对象。在doGet 方法中,我们

    通过其set 方法将获取的session 实例保存,而在doSomething 方法中。通过get 方法取

    出session实例。

    这也就是ThreadLocal的独特之处。它会为每一个线程维护一个私有的变量空间。

    实际上。

    事实上现原理是在JVM 中维护一个Map。这个Map的key 就是当前的线程对象,而value则是

    线程通过ThreadLocal.set方法保存的对象实例。

    当线程调用ThreadLocal.get方法时。

    ThreadLocal会依据当前线程对象的引用。取出Map中相应的对象返回。

    这样,ThreadLocal通过以各个线程对象的引用作为区分,从而将不同线程的变量隔离开

    来。

Session管理之ThreadLocal的更多相关文章

  1. Nhibernate的Session管理

    参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html 但这个方法还不能解决Session缓存问题,由于创建Session需 ...

  2. Android线程管理之ThreadLocal理解及应用场景

    前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...

  3. Openfire的启动过程与session管理

    说明   本文源码基于Openfire4.0.2.   Openfire的启动       Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...

  4. ABP(现代ASP.NET样板开发框架)系列之7、ABP Session管理

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之7.ABP Session管理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...

  5. 2016-1-30 Servlet中Session管理(Sesssion追踪)

    Session管理(Sesssion追踪)是Web应用程序开发中非常重要的一个主题.这是因为HTTP是无状态的,在默认情况下,Web服务器不知道一个HTTP请求是来自初次用户,还是来自之前已经访问过的 ...

  6. Redis3.2+Tomcat实现集群的Session管理 -- tomcat-redis-session-manager的编译和开发部署环境搭建

    已经有不少文章介绍使用tomcat-redis-session-manager来实现Redis存储Tomcat的Session,实现分布式Session管理.但是现在官方编译的tomcat-redis ...

  7. tomcat架构分析 (Session管理)

    Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...

  8. Session管理解决方案笔记

    大型网站Session管理解决方案: 1. web服务器之间的session复制.    优点:方案成熟    缺点:复制的性能开销大 2. 减少session使用,使用客户端存储cookie     ...

  9. 使用Memcached Session Manager扩展Session管理

    >>Tomcat的session管理 在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中. 然后再从request获取sessi ...

随机推荐

  1. JavaSE-07 类

    习要点 面向过程 面向对象 抽象 类 类的构造方法 类中常见的关键字 类的成员方法 类的成员变量 面向过程 程序 程序的概念 程序一词来自生活,通常指完成某些事情的一种既定方式和过程. 可以将程序看成 ...

  2. MFC定时器的使用

    巧妙地使用定时器能达到意想不到的效果,写界面的时候能实现渐变,也能帮助多线程控制等我们知道,在VC的MFC中,已经为我们封装好了很多全面和强大的函数集,所以在MFC编程时,巧妙地调用MFC函数库可以为 ...

  3. TP-LINK配置公网映射

    公室里的主机获取到的地址是路由器分配的私网地址,通常是192.168.1.x,只有挂在同一个路由器底下的其它主机可以访问,路由器外面的主机是无法访问的.但是有时候我们希望把办公室内的服务器上的服务暴露 ...

  4. [Python3网络爬虫开发实战] 2.2-网页基础

    用浏览器访问网站时,页面各不相同,你有没有想过它为何会呈现这个样子呢?本节中,我们就来了解一下网页的基本组成.结构和节点等内容. 1. 网页的组成 网页可以分为三大部分——HTML.CSS和JavaS ...

  5. 【Codeforces 1041D】Glider

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 二分. 枚举每一个上升区的起始位置作为起点(这样做肯定是最优的),然后如果没有掉在地上的话就尽量往右二分(只有上升区之间的间隙会让他往下掉) ...

  6. Linux学习总结(22)——CentOS7.2安装Nginx

    一.使用Yum安装(推荐) 使用Yum安装是推荐的方式,整体的流程非常的简单,也不容易出错,如果不需要什么特殊配置,建议使用Yum尽进行安装. 1.安装epel-release源并进行安装 1 2 3 ...

  7. codeforces 369B

    #include<stdio.h>//题没读懂,没做出来 int main() {      int n,k,l,r,s,s1,m,a,i; while(scanf("%d%d% ...

  8. [ C语言版 ] 数独计算器 [ 搜索剪枝法 ]

    [原创]转载请注明出处. [浙江大学 程序设计专题] 使用方法:按提示输入方式为9*9的矩阵,0表示未知数. 为解决这一问题,我们也尝试了两种方法,准确的说,是第一种方法太慢了,我们对它进行了优化. ...

  9. 整体二分初识--POJ2104:K-th Number

    n<=100000个数有m<=5000个询问,每次问区间第k大. 方法一:主席树!…… 方法二:整体二分. 整体二分一次性计算半个值域对一个区间的询问的贡献,然后根据“这半边的贡献在某个询 ...

  10. RelativeLayout属性大全