Web应用中ThreadLocal的使用
1、ThreadLocal是什么:
ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。线程局部变量并不是Java的新发明,在其它的一些语言编译器实现(如IBM XL FORTRAN)中,它在语言的层次提供了直接的支持。因为Java中没有提供在语言层次的直接支持,而是提供了一个ThreadLocal的类来提供支持,所以,在Java中编写线程局部变量的代码相对比较笨拙,这也许是线程局部变量没有在Java中得到很好的普及的一个原因吧。
2、ThreadLocal在现实中有一个重要的特性:
每一个HTTP请求、都是一个独立的线程,有一个独立的ThreadLocal。利用该特性我们可以利用ThreadLocal进行、HTTP请求生命周期的暂时存取值,不同类之间进行传值。比如传递数据库连接等。至此我们在Web应用不用Scope的变量存放值可以利用以下几种手段:
request、ThreadLocal、session、application等。其作用域大家都知道、就不在此详细说明了。现在说明一下request和ThreadLocal的差别。
3、request和ThreadLocal的差别:
1)、存取值方式不同。
request根据KEY存取值、一个request可以存多个值。
ThreadLocal只能存一个值,ThreadLocal的get和set方法没有参数KEY。
2)、使用地方不一样。
request使用在表示层、一般在Action和Servlet中使用。
ThreadLocal在什么地方都可以、一般用在框架基类中比较多、比如存放当前的数据库连接等。
文章出处:DIY部落(http://www.diybl.com/course/3_program/java/javajs/20091125/183443.html)
分享到:
相关推荐
- **HTTP请求上下文**:在Web应用中,可以利用ThreadLocal传递请求相关的数据,如用户会话信息、请求参数等。 - **线程本地缓存**:为每个线程提供独立的缓存,避免并发访问引起的同步问题。 - **日志记录器**:在...
在Java中,ThreadLocal被广泛应用于Web中间件、服务端编程和微服务架构中,用以解决多线程环境下的数据隔离问题。 首先,ThreadLocal原理是基于每个线程创建一个私有的数据存储结构(ThreadLocalMap),使得线程...
2. **请求上下文**:在Web应用中,可以使用`ThreadLocal`保存HttpServletRequest或Session对象,方便在同一个请求处理链路中访问。 3. **线程状态**:记录线程执行过程中的状态,例如事务管理、计数器等。 然而,...
at 中专门为每一个 web 应用实例创建的类加载器,它负责加载该 web 应用下的所有类。当 web 应用被卸载时,WebappClassLoader 本应随之被垃圾收集器回收。然而,如果存在对 WebappClassLoader 的强引用,那么这个类...
因此,正确地管理ThreadLocal的生命周期,特别是在Web应用和长生命周期线程中,显得尤为重要。 在JDK 1.8中,ThreadLocal被重写了,使用了一种新的实现方式,即使用弱引用和ThreadLocalMap来存放数据。在旧版本中,...
WEB应用数据权限控制是企业信息系统中非常重要的一环,它确保了不同用户在访问系统数据时,只能查看或操作属于其权限范围内的信息。在WEB应用中,数据权限控制通常与用户的身份认证、会话管理、数据库访问控制等方面...
在Web应用中,特别是对于"session"数据的管理,ThreadLocal可以作为一种有效的解决方案。 1. **什么是Session?** Session是HTTP协议中的一个概念,用于存储用户在服务器端的状态信息。当用户登录网站后,服务器会...
需要注意的是,ThreadLocal中的变量并不是存储在堆内存中,而是存储在线程的ThreadLocalMap中。 ```java ThreadLocal<String> threadLocal = new ThreadLocal(); threadLocal.set("线程A的值"); // 在线程A中,可以...
因此,开发者在使用ThreadLocal时必须小心,避免在ThreadLocal中存储长期有效的数据,防止其他线程意外访问。 误区四:ThreadLocal可以随意多用 ThreadLocal虽然能提供方便的线程隔离,但过度依赖ThreadLocal可能...
在Web应用中,尤其是在多线程环境中,ThreadLocal常用于存储线程相关的数据,如数据库连接。使用ThreadLocal来管理数据库连接,可以确保每个请求的生命周期内,连接只被该请求使用,避免了线程间的数据共享问题,...
最后对框架进行优化与扩展,通过对现有框架的优化,使其可以提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为例,教会读者如何设计一款可扩展的Web应用框架。 《架构探险:从零开始写Java Web框架》...
当你在ThreadLocal中创建一个实例时,其实每个线程都有一个与之对应的独立副本。这意味着不同线程可以同时拥有相同ThreadLocal变量的不同实例,互不影响。 2. **创建和访问变量**: 创建ThreadLocal变量非常简单,...
例如,在Web应用服务器中,我们可以用ThreadLocal存储用户的会话信息,确保每个请求都访问到自己专属的数据。 ThreadLocal的使用通常包括以下步骤: 1. 创建ThreadLocal实例,声明变量类型。 2. 在需要的地方,通过...
ThreadLocal在Java编程中是一个非常有用的工具类,它允许在每个线程中独立地存储变量副本,从而实现线程安全的变量...正确管理和清理ThreadLocal变量,或者选择合适的请求作用域管理策略,是确保应用正确运行的关键。
这样,当请求开始时,我们可以在ThreadLocal中创建一个新的事务,处理过程中,所有对数据库的操作都在这个事务下进行。当请求结束时,根据业务逻辑判断是否提交或回滚事务。 5. **具体实现步骤** - **创建...
8. **缺点与注意事项**:ThreadLocal使用不当可能导致内存泄漏,尤其是在Web应用中,需要确保在Web请求结束时清理ThreadLocal。此外,过多的ThreadLocal变量也可能增加内存消耗。 总结起来,"Hibernage_Session_...
例如,在 Web 应用程序中,我们可以使用 ThreadLocal 来存储用户的 Session 信息,以便在多个请求之间共享 Session 信息。 ThreadLocal 是 Java 中的一种强大且灵活的机制,用于实现线程安全和变量隔离。它可以帮助...
如果线程持续存在,即使web应用被重新加载,`ThreadLocal`仍然保留对`MyCounter`和`WebappClassLoader`的引用,导致`WebappClassLoader`不能被垃圾收集器回收,进而引发内存泄漏。 为了解决这个问题,首先我们需要...
3. **隔离状态**:比如在Web应用服务器中,每个线程可以有独立的用户会话信息,保证数据的安全性。 尽管ThreadLocal提供了很多便利,但如果不正确地使用,可能会导致内存泄漏。当线程结束之前没有调用`remove`方法...
现在,Dao类不再需要接受连接作为参数,而是从ThreadLocal中获取。这种方式简化了Service层的代码,减少了异常处理,并且每个Dao方法都能访问到相同的数据库连接,保持在同一事务中。 此外,ThreadLocal还有其他...