背景:
最近做服务化拆分,拆分公共登录的拦截器,看到一些ThreadLocal的使用场景。分享下由下面一段拦截器代码引发的一些ThreadLocal使用场景和面试题的思考。
介绍:
关于ThreadLocal可以参照http://labreeze.iteye.com/blog/2159531
如果把这个拦截器放在最前面,后面如果需要用到request则直接调用WebCommonConstant.requestTL.get
就可以直接获取到request,省了在很多方法里面传参问题,非常方便。
public class WebPreLoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { WebCommonConstant.requestTL.set(request); WebCommonConstant.responseTL.set(response); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { WebCommonConstant.requestTL.remove(); WebCommonConstant.responseTL.remove(); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
由此联想到一些经常被问到的面试题,顺便在这里总结一下。
1. Spring bean默认是单例的,如何保证线程安全?
以前对于这种问题我觉得比较晕,现在我觉得以前可以分成两个方面来回答。
a) 如果Spring bean是无状态的,本身就是线程安全的,无需保证。
b) 如果Spring bean 状态是有状态的,如某个bean里面一个含有一个有状态的属性,则把这个属性用ThreadLocal封装起来,每个线程拥有自己的变量这样就隔离了多线程的问题了。使用这种方式的Spring内部bean有(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)。
示例demo :
public class A { ThreadLocal<Var> localMap = new ThreadLocal<Var>(); public void pre() { Var var =localMap.get(); if(null == var) { var = new Var(); } localMap.set(var); } public void test() { Var var = localMap.get(); var.xx(); } public void post() { localMap.remove(); } }
2. ThreadLocal与同步锁的关系?
ThreadLocal 其实相当于独享变量,避免了锁竞争。但是需要大量的创建对象占用内存。ThreadLocal相当于以空间换时间,锁同步则以时间换空间。
3. ThreadLocal有哪些使用场景?
a) 避免方法传入公共的属性,如request,response这些
b) 避免线程安全问题。
相关推荐
本文将深入探讨ThreadLocal的使用以及Spring框架中的事务管理,这两个主题都是Java开发人员必须掌握的关键技能。 首先,让我们了解ThreadLocal。ThreadLocal是Java提供的一种线程绑定变量的工具类,它允许我们在一...
**线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...
ThreadLocal是Java编程语言中的一个类,用于在多线程环境中提供线程局部变量。它是一种特殊类型的变量,每个线程都有自己的副本,互不影响,从而实现线程间数据隔离。ThreadLocal通常被用来解决线程共享数据时可能...
在 `LeakingServlet` 的 `doGet` 方法中,如果 `ThreadLocal` 没有设置值,那么会创建一个新的 `MyCounter` 并设置到 `ThreadLocal` 中。关键在于,一旦 `MyCounter` 被设置到 `ThreadLocal`,那么它将与当前线程...
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
ThreadLocal 整理 ThreadLocal 是 Java 中的一个重要组件,它能够在每个线程中保持独立的副本。这个功能是通过 Thread 类中的 threadLocals 属性来实现的,这个属性实际上是一个 Entry 数组,其中的每个 Entry 都...
### 正确理解ThreadLocal:深入解析其工作原理与应用场景 #### 一、ThreadLocal的基本概念 `ThreadLocal`是Java平台提供的一种线程局部变量的解决方案,它为每一个使用该变量的线程都提供了独立的变量副本,使得每...
Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,尤其在处理线程间数据隔离和共享时。ThreadLocal不是线程本身,而是为每个线程提供一个独立的变量副本,使得每个线程都可以独立地改变...
Java事务和ThreadLocal是两种在Java编程中至关重要的概念,它们分别用于处理多线程环境下的数据一致性问题和提供线程局部变量。 首先,我们来深入理解Java事务。在数据库操作中,事务是一系列操作的集合,这些操作...
在JDK 8之前,这个内部Map是`ThreadLocal.ThreadLocalMap`,而从JDK 8开始,改为了`WeakReference<ThreadLocal<?>>`和`Object`的组合,提高了内存管理效率。 **JDK 8之前的ThreadLocalMap** 在JDK 8之前,...
以上内容涵盖了从ThreadLocal原理到其在实际开发中的应用,以及相关的多线程、并发编程、HTTP通信等知识点。通过阅读和理解这些资料,开发者可以深化对ThreadLocal的理解,并将其有效地应用于项目中。
### Java中ThreadLocal详解 #### 一、ThreadLocal概述 在Java多线程编程中,`ThreadLocal`是一个非常重要的工具类,它提供了一种在每个线程内部存储线程私有实例的方法。通常情况下,当多个线程共享某个变量时,...
当需要访问session数据时,直接从ThreadLocal中获取: ```java Session session = SessionThreadLocal.SESSION_HOLDER.get(); Object attribute = session.getAttribute("key"); ``` 请求处理完成后,记得清理...
ThreadLocal是Java编程中一种非常特殊的变量类型,它主要用于在多线程环境下为每个线程提供独立的变量副本,从而避免了线程间的数据共享和冲突。然而,ThreadLocal在理解和使用过程中容易产生一些误区,这里我们将...
**线程局部变量(ThreadLocal)** 在Java编程中,`ThreadLocal`是一个非常重要的工具类,它用于在多线程环境中提供线程安全的局部变量。`ThreadLocal`并不是一个线程,而是一个线程局部变量的容器,每个线程都有自己...
本资料主要聚焦于两种设计模式以及Java中的ThreadLocal特性。 首先,我们来探讨单例模式。单例模式是一种确保一个类只有一个实例,并提供全局访问点的设计模式。在Java中,通常通过私有构造函数、静态工厂方法或...
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!