返回章节
第15章测试:ThreadLocal详解
测试你对ThreadLocal工作原理和使用方法的理解
建议时间:15分钟
题目数量:8题
及格分数:60分
1
ThreadLocal的主要作用是什么?
提供线程间的数据共享机制
为每个线程提供独立的变量副本
实现线程同步和互斥
管理线程的生命周期
解析
ThreadLocal的核心作用是为每个线程提供独立的变量副本,实现线程隔离。每个线程访问ThreadLocal变量时,都会得到属于自己的独立副本,不会影响其他线程的数据。
2
ThreadLocal的实现原理中,数据实际存储在哪里?
ThreadLocal对象内部
Thread对象的threadLocals字段
JVM的方法区
全局的静态Map中
解析
ThreadLocal的数据实际存储在每个Thread对象的threadLocals字段中,这是一个ThreadLocalMap类型的变量。ThreadLocal对象作为key,实际的值作为value存储在这个Map中。
3
ThreadLocalMap中Entry的key使用什么类型的引用?
强引用(Strong Reference)
弱引用(Weak Reference)
软引用(Soft Reference)
虚引用(Phantom Reference)
解析
ThreadLocalMap.Entry的key是ThreadLocal的弱引用。这样设计的目的是当ThreadLocal对象没有其他强引用时,可以被垃圾回收器回收,避免内存泄漏。
4
ThreadLocal可能导致内存泄漏的主要原因是什么?
ThreadLocal对象无法被回收
Entry的value无法被回收
ThreadLocalMap无法被回收
Thread对象无法被回收
解析
当ThreadLocal对象被回收后,Entry的key变为null,但value仍然被Entry强引用。在线程池环境中,线程不会销毁,这些null key的Entry无法被及时清理,导致value无法被回收,造成内存泄漏。
5
以下哪种做法可以有效避免ThreadLocal内存泄漏?
将ThreadLocal声明为非静态变量
使用完ThreadLocal后调用remove()方法
避免在ThreadLocal中存储对象
只在主线程中使用ThreadLocal
解析
调用remove()方法是避免ThreadLocal内存泄漏的最有效方法。remove()方法会清理ThreadLocalMap中对应的Entry,释放value的引用,使其能够被垃圾回收。
6
InheritableThreadLocal与ThreadLocal的主要区别是什么?
InheritableThreadLocal性能更好
InheritableThreadLocal支持父子线程值传递
InheritableThreadLocal不会内存泄漏
InheritableThreadLocal支持线程间共享
解析
InheritableThreadLocal允许子线程继承父线程的ThreadLocal值。当创建新线程时,如果父线程有InheritableThreadLocal值,子线程会复制这些值到自己的inheritableThreadLocals中。
7
ThreadLocalMap解决哈希冲突使用的是什么方法?
链地址法(拉链法)
开放地址法(线性探测)
二次探测法
双重哈希法
解析
ThreadLocalMap使用开放地址法中的线性探测来解决哈希冲突。当发生冲突时,会向后查找下一个空位来存储数据。这种方法相比链地址法更节省内存。
8
在Web应用中使用ThreadLocal存储用户上下文时,最佳实践是什么?
在Controller中设置,在Service中清理
在Filter中设置和清理
在Interceptor中设置,让GC自动清理
在每个方法中独立设置和清理
解析
在Web应用中,最佳实践是在Filter中设置和清理ThreadLocal。Filter是请求处理的最外层,可以确保在请求开始时设置用户上下文,在请求结束时(finally块中)清理,避免内存泄漏。
提交答案
0%
继续努力!
0
答对题数
8
总题数
0%
正确率
重新测试
返回章节