单例对象,在多线程环境中使用时,为了避免线程冲突,大家都知道要通过ThreadLocal来管理该对象,为每个线程保存该对象副本,spring中管理bean、hibernated的SessionFactory管理Session都是这么做的,但是ThreadLocal有一个子类InheritableThreadLocal,使得父子线程之间能够共享实例,如
Java代码
- private static ThreadLocal<Context> configHolder = new InheritableThreadLocal();
在web应用场景中能够解决一些问题,网上搜一下,很多文章都表示如果父子线程想传递变量可以用InheritableThreadLocal,可是本人就碰到一个场景,绝对不适用:
目前很多应用都会使用quartz,比如在晚上让系统来处理一些任务,但是当这些任务同时执行时,由于有共同的quartz的父任务,导致这些任务来操作通过InheritableThreadLocal管理的对象时,可能导致线程冲突,所以在这种场景下要慎用InheritableThreadLocal。
当时场景是这样的,晚上系统通过quartz的定时任务,来统计系统的访问统计信息,由于本系统是一个应用管理多个网站,每个网站的信息是通过一个Context来保存访问具体哪个网站的,当执行quartz后,有些网站的关键词显然不是这个网站的,当时觉得问题很诡异,最后通过加了大量输出时发现,在一个网站的统计还没结束时,Context里的网站已经被切换了,显然这不是自己的任务切换的,最终发现同时有另外的Quartz任务也在操作Context对象,这类问题很难定位原因,当时搞了很久才发现这个原因
转载自:http://www.iteye.com/topic/1063206
分享到:
相关推荐
总的来说,ThreadLocal和InheritableThreadLocal是处理线程相关数据的有效工具,但使用时需谨慎,避免引发并发问题。在Android开发中,它们常用于存储与线程生命周期相关的数据,如Looper、Handler的MessageQueue等...
线程局部变量(ThreadLocal)和可继承线程局部变量(InheritableThreadLocal)是两种非常重要的工具,它们允许我们在多线程环境中创建独立于线程的局部变量,确保每个线程拥有自己的变量副本,避免了并发访问时的...
在实际开发中,应谨慎使用`InheritableThreadLocal`,并结合其他设计模式和最佳实践,如使用拦截器、依赖注入等方法来管理上下文信息,以提高代码的可读性和可维护性。 文件`transmittable-thread-local_master.zip...
ThreadLocal和InheritableThreadLocal是Java中处理线程局部变量的两个类,它们主要用于解决多线程环境下的数据隔离问题。线程安全是并发编程中的核心问题之一,当多个线程访问同一份共享资源时,可能会导致数据不...
* 在使用 InheritableThreadLocal 时,需要注意线程安全问题,以免出现数据一致性问题。 InheritableThreadLocal 是一种强大的多线程编程工具,能够帮助我们实现复杂的多线程编程场景。但是,需要 chúngproperly ...
使用TransmittableThreadLocal 可以解决多种线程池之间的数据传递问题,如线程池之间的数据共享、线程池之间的任务传递等问题。 在实际应用中,TransmittableThreadLocal 可以应用于各种场景,如在微服务架构中,多...
:backhand_index_pointing_right:在使用线程池等会池化复用线程的执行组件情况下,提供ThreadLocal值的传递功能,解决异步执行时上下文传递的问题。一个Java标准库本应为框架/中间件设施开发提供的标配能力,本库...
Scoped Value 解决了在线程之间共享变量的问题,ThreadLocal 和 InheritableThreadLocal 都有其缺陷。ThreadLocal 需要手动清理,且变量不能被子线程继承;InheritableThreadLocal 可以共享信息,但是数据会拷贝多份...
**其他并发工具类与锁原理**:这部分内容涉及ThreadLocal的工作原理、InheritableThreadLocal如何传递线程局部变量、CyclicBarrier和CountDownLatch的区别与用法、Semaphore信号量机制、CopyOnWriteArrayList如何...
Spring AOP使用动态代理技术,对于实现了接口的类使用JDK动态代理,而对于未实现接口的类则使用Cglib代理。Spring AOP支持通过配置来指定增强逻辑,如前置通知、后置通知等。 #### 控制反转(IoC)设计思想 控制...
Spring Security 是一个强大的且高度可定制的 Java 安全框架,用于处理Web应用程序的安全性问题。在Spring Security 3.1版本中,该框架提供了一套完善的解决方案来管理认证、授权以及访问控制。这个实例主要展示了...
Java并发编程还涉及到线程的状态转换、线程池的使用、原子操作、线程安全问题等。 #### 线程状态与上下文切换 线程具有几种状态,包括新建(NEW)、就绪(RUNNABLE)、运行(RUNNING)、阻塞(BLOCKED)、等待...
- **ThreadLocal**:线程局部变量,为每个线程提供独立的变量副本,解决变量的线程安全问题。 - **InheritableThreadLocal**:继承自`ThreadLocal`,用于创建可继承的线程局部变量。 ##### java.lang.ref包下的类 ...
在Java 2(J2SE)中,`java.lang`包添加了一些新的类和方法,如`InheritableThreadLocal`,`ThreadLocal`的扩展,使得子线程可以继承父线程的变量,以及`SecurityManager`,用于实现安全管理策略。 过时方法在Java ...