让我们每天都有进步,老王带你打造最全的 Java 面试清单,认真把一件事做到极致。

本文是前文《Java 最常见的 200+ 面试题》的第一个补充模块。

1.ThreadLocal 是什么?

ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,适用于各个线程不共享变量值的操作。

2.ThreadLocal 工作原理是什么?

ThreadLocal 原理:每个线程的内部都维护了一个 ThreadLocalMap,它是一个 Map(key,value)数据格式,key 是一个弱引用,也就是 ThreadLocal 本身,而 value 存的是线程变量的值。

也就是说 ThreadLocal 本身并不存储线程的变量值,它只是一个工具,用来维护线程内部的 Map,帮助存和取变量。

数据结构,如下图所示:

(图片来源于网络)

3.ThreadLocal 如何解决 Hash 冲突?

与 HashMap 不同,ThreadLocalMap 结构非常简单,没有 next 引用,也就是说 ThreadLocalMap 中解决 Hash 冲突的方式并非链表的方式,而是采用线性探测的方式。所谓线性探测,就是根据初始 key 的 hashcode 值确定元素在 table 数组中的位置,如果发现这个位置上已经被其他的 key 值占用,则利用固定的算法寻找一定步长的下个位置,依次判断,直至找到能够存放的位置。

源代码实现如下:

/* Increment i modulo len.*/
private static int nextIndex(int i, int len) {return ((i + 1 < len) ? i + 1 : 0);
}/* Decrement i modulo len.*/
private static int prevIndex(int i, int len) {return ((i - 1 >= 0) ? i - 1 : len - 1);
}

4.ThreadLocal 的内存泄露是怎么回事?

ThreadLocal 在 ThreadLocalMap 中是以一个弱引用身份被 Entry 中的 Key 引用的,因此如果 ThreadLocal 没有外部强引用来引用它,那么 ThreadLocal 会在下次 JVM 垃圾收集时被回收。这个时候 Entry 中的 key 已经被回收,但是 value 又是一强引用不会被垃圾收集器回收,这样 ThreadLocal 的线程如果一直持续运行,value 就一直得不到回收,这样就会发生内存泄露。

5.为什么 ThreadLocalMap 的 key 是弱引用?

我们知道 ThreadLocalMap 中的 key 是弱引用,而 value 是强引用才会导致内存泄露的问题,至于为什么要这样设计,这样分为两种情况来讨论:

  • key 使用强引用:这样会导致一个问题,引用的 ThreadLocal 的对象被回收了,但是 ThreadLocalMap 还持有 ThreadLocal 的强引用,如果没有手动删除,ThreadLocal 不会被回收,则会导致内存泄漏。
  • key 使用弱引用:这样的话,引用的 ThreadLocal 的对象被回收了,由于 ThreadLocalMap 持有 ThreadLocal 的弱引用,即使没有手动删除,ThreadLocal 也会被回收。value 在下一次 ThreadLocalMap 调用 set、get、remove 的时候会被清除。

比较以上两种情况,我们可以发现:由于 ThreadLocalMap 的生命周期跟 Thread 一样长,如果都没有手动删除对应 key,都会导致内存泄漏,但是使用弱引用可以多一层保障,弱引用 ThreadLocal 不会内存泄漏,对应的 value 在下一次 ThreadLocalMap 调用 set、get、remove 的时候被清除,算是最优的解决方案。

6.ThreadLocal 的应用场景有哪些?

ThreadLocal 适用于独立变量副本的情况,比如 Hibernate 的 session 获取场景。

示例代码:

private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();public static Session getCurrentSession(){Session session =  threadLocal.get();try {if(session ==null&&!session.isOpen()){//...}threadLocal.set(session);} catch (Exception e) {// TODO: handle exception}return session;
}

查看所有面试题:《Java 最常见 200+ 面试题》

参考资料

https://www.jianshu.com/p/a1cd61fa22da

https://www.jianshu.com/p/98b68c97df9b

扫描下方二维码,关注更多动态:

往期文章推荐:

《Java 最常见的 200+ 面试题》

《你真的懂 == 和 equals 的区别吗?》

《程序员精美简历Top榜—面试必备》

《程序员专属精美简历合集——第二弹》

Java 200+ 面试题补充 ThreadLocal 模块相关推荐

  1. Java 200+ 面试题补充② Netty 模块

    让我们每天都能看到自己的进步.老王带你打造最全的 Java 面试清单,认真把一件事做到最好. 本文是前文<Java 最常见的 200+ 面试题>的第二个补充模块,第一模块为:<Jav ...

  2. Java 200+ 面试题补充③ Dubbo 模块

    昨天在我的 Java 面试粉丝群里,有一个只有一年开发经验的小伙伴只用了三天时间,就找到了一个年薪 20 万的工作,真是替他感到开心. 他的经历告诉我们:除了加强自我实战经验之外,还要努力积累自己的理 ...

  3. java netty 面试_Java 200+ 面试题补充② Netty 模块

    让我们每天都能看到自己的进步.老王带你打造最全的 Java 面试清单,认真把一件事做到最好. 1.Netty 是什么? Netty 是一款基于 NIO(Nonblocking I/O,非阻塞IO)开发 ...

  4. 面试必备:《Java 最常见 200+ 面试题全面解析》

    春招在即,想让面试官在短短的几十分钟内就认可你的能力? 想在最快的时间内收获 Java 技术栈最核心的知识点? 想要更全面.更深入的了解 Java 技术? 这里能够给你想要的所有答案? 给准备面试的大 ...

  5. 2020年 Java 最常见200+ 面试题全解析:面试必备

    Java 最常见200+ 面试题全解析:面试必备 如想了解更多更全面的Java必备内容可以阅读:所有JAVA必备知识点面试题文章目录: JAVA必备知识点面试题 序 言 在本篇文章开始之前,我想先来回 ...

  6. Java经典面试题汇总200道

    超详细的Java学习资料汇总 Java经典面试题汇总 Java 基础 1. JDK 和 JRE 有什么区别? 2. == 和 equals 的区别是什么? 3. 两个对象的 hashCode()相同, ...

  7. 测试开发java常见面试题_Java常见面试题200+,学习、面试必备

    本套Java面试题,选取了企业面试最常问到的问题,可以做为Java工程师的面试宝典,也可以做为想要不断完善和扩充自己 java 技术的学习者. 主要包含: Java 基础.容器.多线程.反射.对象拷贝 ...

  8. 自己记录的一些Java后端面试题

    一.说明 记录了一些自己的面试问题....找工作真难啊 干这行 太卷了 算法得会把 基础还得非常扎实 源码也得看 目录 一.说明 二.Java基础部分 java基础 1.String s = &quo ...

  9. java面试题_阿里大厂流出的数百道 Java 经典面试题

    BAT 常问的 Java基础39道常见面试题 1.八种基本数据类型的大小,以及他们的封装类 2.引用数据类型 3.Switch能否用string做参数 4.equals与==的区别 5.自动装箱,常量 ...

最新文章

  1. i7 7700hq安装Linux,黑苹果安装火影金刚4K VULCAN JinGang GTX i7-7700HQ 独显驱动 Hackintosh...
  2. 基础矩阵,本质矩阵,单应性矩阵讲解
  3. 深度学习环境配置指南!(Windows、Mac、Ubuntu全讲解)
  4. Five ways to maximize Java NIO and NIO.2--转
  5. linux系统中/etc/syslog.conf文件解读
  6. 用python编写表达式求值_用Python3实现表达式求值
  7. java-回调机制详解
  8. 远控免杀专题(18)-ASWCrypter免杀
  9. vue框架可以配合php做企业站,基于Vue和PHP打造前后端分离的通用管理系统(一)...
  10. jQuery-Selectors(选择器)的使用(一、基本篇)
  11. 基于JAVA+Servlet+JSP+MYSQL的教室预订管理系统
  12. 静态页中利用AJAX.NET实现无刷新页面
  13. matlab将txt数据分类,MATLAB读取txt文件,txt里面有字符串和数值两种类型
  14. 全开源!Office多人协作应用,在线编辑Word、Excel和PPT文档
  15. 甲骨文裁员后会打算将云计算作为主战场吗?
  16. 《 嵌入式系统设计与实践》一一2.1 构建系统框图
  17. 风口的猪-中国牛市(动态规划)
  18. kafka第二次课!!!
  19. CSS复合选择器---后代选择器、子选择器、并集选择器、伪类选择器
  20. Win7 突然没声音 无法播放测试音调

热门文章

  1. jdbc mysql分页_JDBC【数据库连接池、DbUtils框架、分页】
  2. LDAP命令介绍---import-ldif
  3. Shell脚本——数字计算
  4. JavaScript 函数节流 throttle 和防抖 debounce
  5. Item 13 Minimize the accessibility of classes and members
  6. MySQL关闭Enterprise Server源码
  7. 之江学院第0届 A qwb与支教 容斥与二分
  8. 结组项目-四则运算3
  9. Linux利用PROMPT_COMMAND实现审计功能
  10. phpexcel.php linux,phpexcel在linux系统报错如何解决