本文目录一览:
- 1、对比ThreadlLocal、InheritableThreadLocal、Transmittable-Thread-Lo...
- 2、京东一面:说出ThreadLocal的使用场景及使用方式
- 3、ThreadLocal的内存泄露的原因分析以及如何避免
- 4、transmittablethreadlocal的作用
对比ThreadlLocal、InheritableThreadLocal、Transmittable-Thread-Lo...
1、ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal对比 ThreadLocal 功能:提供线程局部变量,实现线程间数据隔离。每个线程通过get()和set()操作自己的变量,不影响其他线程。原理:每个Thread对象维护一个ThreadLocalMap,ThreadLocal作为key,变量值作为value存储在此Map中。
2、不过,回忆起很早之前对ThreadLocal源码的分析,其中提到了ThreadLocal存在向预先创建的线程中传递变量的局限性。恰好,我的一位前同事,HSBC的技术大牛,提到了团队引入了transmittable-thread-local(TTL)来解决此问题。
3、最初,作者对TransmittableThreadLocal的理解存在偏差,误以为它不能获取父线程的本地变量,直到发现线程池中的第一批子线程是直接从主线程创建,因此能继承到父线程的变量。然而,线程池复用机制导致后续创建的子线程无法及时获取到父线程变量的更新,这为解决问题埋下了隐患。
京东一面:说出ThreadLocal的使用场景及使用方式
1、解决方案:使用ThreadLocal存储线程内全局变量,各方法直接通过get()获取,避免参数传递。
2、ThreadLocal原理:分析ThreadLocal的工作原理及内存泄露问题。事务特性:讨论事务的ACID特性(原子性、一致性、隔离性、持久性)。隔离级别:阐述数据库事务的隔离级别及其应用场景。幻读解释:解释幻读的概念及在事务中的影响。索引结构:讨论索引的B+树结构及其优势。
3、面试关卡:技术面以“细节控”著称,笔试涵盖操作系统、网络协议、C++内存模型等冷门考点(如“ThreadLocalMap的开放寻址法实现”)。面试官会深挖项目细节,未系统刷题的候选人即使经验丰富也可能被淘汰。
4、Java多线程:包括多线程的实现方式、线程的状态、同步的实现、线程死锁及避免方法、线程阻塞原因、run()与start()的区别、synchronized和volatile的区别、线程安全的保证方法、ThreadLocal的用法和原理、notify和notifyAll的区别、线程池的创建和使用、常见锁类型、sleep()和wait()的区别等。

ThreadLocal的内存泄露的原因分析以及如何避免
ThreadLocal内存泄漏问题主要源于其内部实现机制和使用方式不当。
在这个情况下,存在一个线程访问或者修改另一个线程的数据的可能性。当数据不允许这样共享的时候,我们应该做成线程安全的。)方法,在remove和set方法中都会调用这个方法。ThreadLocal为了避免内存泄露,不仅使用了弱引用维护key,还在每个操作上检查key是否被回收,进而再回收value。
key 不再强引用 ThreadLocal 实例。解决的问题:当 ThreadLocal 实例被外部回收后,Entry 的 key 会变为 null,避免因 key 无法释放导致的整组 Entry 泄漏。副作用:value 仍为强引用,若未手动 remove(),线程存活时 value 仍会驻留内存(value 泄漏)。
remove():必须调用以避免内存泄漏(见下文)。注意事项内存泄漏风险 原因:ThreadLocalMap中的Entry对key(ThreadLocal实例)是弱引用,但对value是强引用。若线程池中的线程长期存活且未调用remove(),value可能无法被回收。解决方案:使用后务必调用remove()清理资源。
TTL的改进:通过拦截线程创建过程(如通过Runnable包装器),在子线程初始化前将父线程的ThreadLocal值复制到共享容器中,子线程启动时再从容器读取并设置到自身的ThreadLocal中。特殊容器的作用 容器类型:通常使用WeakHashMap或自定义结构存储父线程的ThreadLocal值,避免内存泄漏。
transmittablethreadlocal的作用
TransmittableThreadLocal(TTL)的作用是解决ThreadLocal在线程池等场景下无法正确传递值的难题。以下是详细阐述:解决ThreadLocal的局限性普通ThreadLocal在线程复用时(如线程池),其值会保留在线程本地,导致数据污染或不一致。
发射器Transmitter是TransmittableThreadLocal的一个公有静态类,提供传输TransmittableThreadLocal实例和注册当前线程变量至其他线程的功能。通过Transmitter的静态方法,可以实现捕获、重放和复原线程本地变量的功能。TTL通过TtlRunnable类实现了任务的封装,确保在执行任务时能够捕获和传递线程本地变量。
TransmittableThreadLocal通过在执行线程中加入特定封装,确保线程间变量的传递。其关键在于封装Runnable/Callable类,并在执行前对线程变量进行快照,然后在执行过程中将快照传递给子线程。这样,即使子线程复用旧线程,也能接收到最新变量值,避免了因线程池复用导致的变量丢失问题。
TransmittableThreadLocal(TTL)是一种特殊的ThreadLocal实现,用于在父子线程之间传递上下文信息。其核心原理在于通过特殊的容器和线程生命周期管理,实现跨线程的变量值传递。
代码运行结果显示,主线程更新InheritableThreadLocal值后,子线程仍使用旧值,无法确保数据安全。为解决此问题,引入了Alibaba开源的TransmittableThreadLocal,它是InheritableThreadLocal的增强版本,旨在解决线程池等组件下线程间值传递的问题。首先,需要添加TransmittableThreadLocal的maven依赖。
本文来自作者[凌痴凝]投稿,不代表乘龙号立场,如若转载,请注明出处:https://www.cdyqh.com/miao/5445.html
评论列表(4条)
我是乘龙号的签约作者“凌痴凝”!
希望本篇文章《【threadlocal,ThreadLocalRandom】》能对你有所帮助!
本站[乘龙号]内容主要涵盖:乘龙号,生活百科,小常识,生活小窍门,百科大全,经验网
本文概览:本文目录一览:1、对比ThreadlLocal、InheritableThreadLocal、Transmittable-Thread...