`
jay88489
  • 浏览: 70547 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

论ThreadLocal

    博客分类:
  • J2EE
阅读更多
Web 应用程序开发中, 我们往往也需要在 Action 里直接获取请求 (Request) 或会话( Session )的一些信息 , 甚至需要直接对 Http Servlet 的请求( HttpServletRequest )、响应 (HttpServletResponse) 进行操作。先参照一下webwork的ActionContext 实现:
public class ActionContext implements Serializable {  
        static ThreadLocal actionContext = new ActionContextThreadLocal();  
	public static final String SESSION = "com.opensymphony.xwork.ActionContext.session";  
    
	private static class ActionContextThreadLocal extends ThreadLocal {  
	protected Object initialValue() {  
        OgnlValueStack vs = new OgnlValueStack();    
           return new ActionContext(vs.getContext());  
        }  
} 
 
我们在 Action 中取得 request ,session “ username ”的值时通过:
//get request scope value
Map params = ActionContext.getContext().getParameters();
String username = (String) params.get("username"); 
//get session scope value
Map session = ActionContext.getContext().getSession();
String username = (String) params.get("username"); 
 

 

ActionContext com.opensymphony.xwork.ActionContext )是 Action 执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个 Map 而已),它存放放的是 Action 在执行时需要用到的对象
一般情况,我们的 ActionContext 都是通过: ActionContext context = (ActionContext) actionContext.get(); 来获取的。我们再来看看这里的 actionContext 对象的创建: static ThreadLocal actionContext = new ActionContextThreadLocal(); ActionContextThreadLocal 是实现 ThreadLocal 的一个内部类。 ThreadLocal 可以命名为“线程局部变量”,它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。这样,我们 ActionContext 里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。


我们再来看一下Acegi的实现
在一个RequestServletListener,然后在每次request时,从session中取得UserBean,置到ThreadLocal中,这样在业务层就可以直接取用了。



ThreadLocal则相当于多个线程的一个共享全局变量存储地,它里面保存的是和每个线程相关的状态。所以threadLocal是为线程服务的,和线程处于一个底层位置。
正因为Spring/Hibernate这些框架对于状态处理短处,所以才只能透过Web容器的request等状态封装,直接到底层操作与线程同一层次的threadLocal。
Request是客户端发出的一个请求,这个request的载体就是一个线程,实际等同于一个线程的生命周期。Request是封装在线程上面一个抽象概念。当一个线程或request结束时,threadlocal中的状态就没有了,所以threadLocal基本类似request.setAttribute作用,threadLocal中的对象状态的生命周期等同于request.
分享到:
评论

相关推荐

    java8-threadlocal

    Java 8 中的 ThreadLocal 是一个非常重要的工具类,它为每个线程提供了一个独立的变量副本,使得每个线程可以独立地改变自己的副本,而不会影响其他线程所对应的副本。这个特性在多线程编程中被广泛用于管理线程相关...

    Java 开发JAVA公共资源模块的设计与开发(源代码+论文).rar

    11. **并发处理**:如果公共资源模块涉及多线程操作,那么需要理解Java的并发API,如synchronized、ThreadLocal和ExecutorService,以保证线程安全。 12. **源代码+论文**的结合提供了理论与实践的双重学习机会,...

    高效Java后台程序缓存用户信息的研究.pdf

    为了解决这个问题,本文提出并完善了两种高效的用户信息缓存方式:一种是通过HttpServetRequest对象缓存数据,另一种是使用ThreadLocal来保存用户信息。 HttpServetRequest对象缓存数据的核心思想是在用户请求到达...

    计算机专业毕业论文题目_大全.docx

    - 多线程与并发:探讨Java并发库,如ExecutorService、Future、ThreadLocal等。 5. JSP类论文题目: JSP(JavaServer Pages)是Java Web开发的一部分,用于生成动态网页。可能的研究点有: - JSP基本元素:脚本元素...

    通向架构师的道路

    - **性能测试与优化**:作者强调性能测试的重要性和方法论,并在Apache服务器和Tomcat这两个部分分别讲解了优化技巧,涉及并发数调整、服务端压缩、安全防护、资源管理和监控等。 #### 集群技术 - **高可用与负载...

    Java多线程与线程安全实践-基于Http协议的断点续传

    4. **线程局部变量**:`ThreadLocal`类提供了一种线程内的局部变量,每个线程都拥有自己的一份独立副本,互不影响。 5. **volatile关键字**:它用于标记一个变量,使得多个线程可以共享这个变量,且能保证可见性和...

    美团的Mtrace分布式会话跟踪系统架构设计与实践

    1. **埋点技术**:Mtrace通过在服务端代码中插入埋点代码,记录服务调用过程中的关键信息,如服务名、方法名、耗时等,并通过ThreadLocal存储同步调用上下文,通过显式调用支持异步调用上下文。 2. **数据传输**:...

    软件开发和管理理念(一).pdf

    例如,考察开发人员对ThreadLocal的理解、Hibernate的高级用法,以及对数据库连接的理解,可以帮助企业发现具有深厚技术功底的人才。这些技术问题的考察,不仅是对个人技术能力的检验,也是对团队整体素质的提升。它...

    大型应用系统架构设计 淘宝分布式调用跟踪系统介绍 共60页.pptx

    \n\n在系统架构中,鹰眼首先通过中间件进行埋点,利用ThreadLocal存储调用信息,实现异步写入日志,并采用采样的方式减少性能影响。一旦发生问题,可以实时抓取日志,按照Traceld汇总,然后根据不同的存储策略进行...

    软件开发和管理理念

    4. **Hibernate**:解决大部分数据库交互问题,同时深入了解Hibernate的核心概念,如ThreadLocal、inverse和cascade等,以提高使用效率。 #### 四、敏捷开发方法 为了进一步提升生产力,采用**Scrum**开发模式,并...

    J2EE开发全程实录PDF J2EE开发全程实录PDF

    - **ThreadLocal类**:介绍Java中的ThreadLocal类及其使用方法。 - **线程变量管理器的实现**:实现了一个线程局部变量管理器,用于管理线程内的变量。 - **事务**: - **为什么需要事务**:为了保证数据操作的...

    bnpprhinos:交响黑客马拉松

    熟悉synchronized、volatile、ThreadLocal等并发工具类,以及ExecutorService和Future接口的应用,可以构建高效且稳定的系统。 4. **JVM优化**:理解和调整Java虚拟机(JVM)参数,如堆内存设置、垃圾回收策略等,...

Global site tag (gtag.js) - Google Analytics