ThreadLocal作用,总结起来一句话就是,让线程轻松的就可以获得独立实例,不用在线程创建的时候传入。
ThreadLocal在资源实例里使用(创建一个方法A,A创建一个实例并与ThreadLocal绑定),用来在run()方法中调用该方法A。
spring中访问数据库的模板使用了ThreadLocal技术,数据库资源本来是非线程安全的,如果使用synchronized进行同步,大大降低了并发访问。
ThreadLocal,实际上应该理解为Thread的局部变量。
把非线程安全的变量与current的线程绑定。每个访问的线程拿到的都是属于自己的一份。
多个线程之间并不是共享实例,而是利用ThreadLocal给每个线程绑定一个实例。
这样在某个线程调用到该实例时,会先去判断该线程是否已经绑定了该实例,如果没有,则获取或创建一个新的实例。
同时,如果某个线程结束了,其相应的绑定的实例也会被回收。
public class CountNum {
private static ThreadLocal<CountNum> countNumLocals
= new ThreadLocal<CountNum>();
public static CountNum getCountNum(){
if (CountNum.countNumLocals.get() == null) {
System.out.println("here");
CountNum.countNumLocals.set(new CountNum());
}
return CountNum.countNumLocals.get();
}
private int i = 0;
public void increase(){
++i;
System.out.println(Thread.currentThread().getName() + " : " + i);
}
public void decrease(){
--i;
System.out.println(Thread.currentThread().getName() + " : " + i);
}
public static void main(String[] args) throws InterruptedException{
Thread.sleep(1000);
Thread t1 = new Thread(new Increase());
Thread t2 = new Thread(new Increase());
Thread t3 = new Thread(new Decrease());
t1.start();
t2.start();
t3.start();
}
}
public class Increase implements Runnable{
public Increase(){
}
@Override
public void run() {
CountNum countNum = CountNum.getCountNum();
for(int i = 0; i< 50; i++){
countNum.increase();
}
}
}
public class Decrease implements Runnable {
public Decrease(){
}
@Override
public void run() {
CountNum countNum = CountNum.getCountNum();
for(int i = 0; i< 50; i++){
countNum.decrease();
}
}
}
从上面的实例可以看到,如果有多个线程执行Increase 的run()方法,如果不用ThreadLocal, countNum实例只能通过类似在构造方法中传入的方法。
但这样有很多缺点:
1)此实例就成了全局变量,当线程结束时,不能自动回收。
2)实例的传入是个问题,何时传入,在什么地方传入,在实际项目中(如servlet)将变得复杂。 要想使实例独立,必须在每个线程启动的时候传入实例。
在web项目中,多线程启动的地方是在web服务器内,我们没法去修改代码传入实例。
在线程的run()中传入实例,将造成多个线程并发访问的状态。 实例不能独立,并且需要考虑并发的情况。
分享到:
相关推荐
本文将深入探讨ThreadLocal的使用以及Spring框架中的事务管理,这两个主题都是Java开发人员必须掌握的关键技能。 首先,让我们了解ThreadLocal。ThreadLocal是Java提供的一种线程绑定变量的工具类,它允许我们在一...
在Spring事务管理中,连接池与ThreadLocal结合,确保每个线程在事务内使用的是同一连接,避免了事务间的干扰。例如,`HikariCP`和`C3P0`等流行的连接池实现都支持与Spring事务管理的无缝集成。 在实际应用中,理解...
NULL 博文链接:https://bijian1013.iteye.com/blog/2380233
本文详解了Spring Cloud中Hystrix线程隔离导致ThreadLocal数据丢失的问题,并通过实例代码演示了该问题的出现原因和解决方法。 知识点1:Hystrix线程隔离 Hystrix是Spring Cloud中的一种断路器实现,用于防止服务...
- 尽量避免将ThreadLocal用作长期持有的全局变量,尤其是在静态方法或静态变量中使用。 - 避免过度依赖ThreadLocal,因为它可能导致设计上的复杂性和难以维护的问题。 综上所述,ThreadLocal是Java多线程编程中的一...
1. 存储当前会话用户信息:例如,可以在一个线程中使用ThreadLocal保存用户的登录状态,确保每个线程只处理一个用户的信息。 2. 存放上下文变量:如WebWork的ActionContext,它可以保存请求处理过程中的各种上下文...
通过ThreadLocal,可以保证这些信息在Action的不同调用中保持一致,即在同一个请求的不同阶段中,即使使用不同的线程去处理,它们依然能访问到相同的上下文信息。 黄老邪,作为京东的资深架构师,拥有近20年的行业...
ThreadLocal 的使用非常广泛,例如在 Spring 和 Hibernate 中都大量使用了 ThreadLocal。下面是一个使用 ThreadLocal 的具体例子: ```java public class SequenceNumber{ //通过匿名内部类覆盖 ThreadLocal 的 ...
在实际开发中,有些框架如Spring已经内置了对ThreadLocal的管理和清理机制,可以更方便地在多线程环境中使用session。 总结,ThreadLocal是Java中处理线程局部数据的利器,特别适用于需要线程隔离的场景,如Web...
Java事务管理主要体现在JDBC API和一些高级框架如Spring中。在JDBC中,我们可以通过Connection对象的setAutoCommit(false)方法来开启手动提交事务,然后通过commit()或rollback()方法来控制事务的提交或回滚。在...
在一些框架或库中,如Spring,ThreadLocal被用来存储线程相关的配置信息。 4. **局部状态:** 在多线程环境中,当每个线程需要有自己的状态(如计数器),ThreadLocal提供了一种优雅的解决方案。 尽管...
6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...
ThreadLocal 在 Spring 中发挥着重要的作用,在管理 request 作用域的 Bean、事务管理、任务调度、AOP 等模块都出现了它们的身影,起着举足轻重的作用。要想了解 Spring 事务管理的底层技术,ThreadLocal 是必须...
例如,在Spring的DAO模板类中,尽管底层的数据连接或会话资源是非线程安全的,但是通过使用ThreadLocal,可以为每个线程绑定独立的数据连接或会话,使得多个DAO可以复用同一个模板实例而不会发生资源冲突,极大地...
6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...
线程中的操作往往涉及到多线程环境下的资源共享和管理,因此,如何在线程中正确地获取并使用Spring通过注解注入的对象,是一个常见的问题。本文将详细探讨这个主题。 首先,Spring的注解主要分为三类:配置注解(如...
Spring Security 3.0.1 是在 Spring Security 3.0 的基础上进行的一次 bug 修复版本,主要针对先前版本中存在的问题进行了修正。此次版本未引入新的功能,但修正了一些已知的问题,增强了稳定性。 ##### 1.4 获取 ...
在Java Web应用中,由于每个HTTP请求都在一个独立的线程中处理,我们可以使用ThreadLocal来存储每个请求的事务状态。这样,当请求开始时,我们可以在ThreadLocal中创建一个新的事务,处理过程中,所有对数据库的...
例如,Spring Security 中的 ThreadLocalSecurityContextHolderStrategy 类就是使用 ThreadLocal 来实现的。 三、如何创建一个 ThreadLocal 实例 创建一个 ThreadLocal 实例非常简单,只需要使用 private static ...