我凭ThreadLocal唬住了京东面试官

简介: 关于ThreadLocal,网络上的文章不计其数,一开始我也是无从下手,费了好大劲才搞懂,现在把自己理解的ThreadLocal记录在博客,以帮助到更多同学;

关于ThreadLocal,网络上的文章不计其数,一开始我也是无从下手,费了好大劲才搞懂,现在把自己理解的ThreadLocal记录在博客,以帮助到更多同学;


我理解的ThreadLocal

ThreadLocal中文名叫线程变量,它底层维护了一个map,key就是当前的ThreadLocal对象(可以理解为当前执行该段代码的线程),value就是你set的值,这个map保证了各个线程的数据互不干扰

  //这是ThreadLocal类的set方法源码
    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
          //看这行,精华就在这行
            map.set(this, value);
        else
            createMap(t, value);
    }
  //这是get方法
    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
          //精华在这儿,用人话讲就是通过当前线程对象去map里面找对应的entry
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
              //entry.value就拿到你set的value啦
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }

ThreadLocal和Synchonized对比

Synchonized不用多说,不清楚的请移步synchronized底层实现原理


而ThreadLocal为解决并发编程提供了新的思路,synchronized是共享线程间的数据,而ThreadLocal是隔离线程间的数据


synchronized是利用锁的机制,使变量或代码块在某一时该只能被桶一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。


ThreadLocal使用不当引起的内存泄漏

ThreadLocal大法虽然好,但是使用不当后果很严重


造成原因:


ThreadLocal没有外部强引用,在发生垃圾回收的时候,ThreadLocal会被当成垃圾给干掉,而ThreadLocal对象又是Map中的key,map的key没了,那对应的entry永远不会被访问到,就无法被回收,进而造成内存泄漏


解决方案:


1、每次用完ThreadLocal都调用它的remove()方法清除数据

2、将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进而被清除


ok我话讲完


相关文章
|
2天前
|
缓存 算法 NoSQL
京东物流面试真题(附参考答案)
京东物流面试真题(附参考答案)
26 1
|
9月前
|
消息中间件 缓存 NoSQL
面试京东T5,被按在地上摩擦,鬼知道我经历了什么?
面试京东被问到的问题: 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? 如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么? 如何设计一个高并发系统? 分布式服务接口的幂等性如何设计(比如不能重复扣款)?
|
9月前
|
算法 Dubbo Java
Java开发5年,复习1个月成功上岸京东物流,面试和复习思路分享
最近有很多小伙伴在后台私信我说,马上金九银十了,现在准备跳槽涨薪的同学越来越多了,想要一些速成的面试题和面试技巧,特地今天马老师为大家整理了这三套阿里巴巴2022年全年Java岗面试题总结+一线互联网大厂Java岗面经+一线互联网大厂Java岗面试题总结!
|
2天前
|
NoSQL Java 关系型数据库
分享面试阿里、京东、网易等大厂后的面经及面试心得—远程面试
受疫情影响,阿里、百度、网易等互联网企业都开启了远程面试。 那么远程面试和正常面试有什么不同吗?并没有! 企业招聘的要求没有改变,改变的仅仅是面试的地点。今年远程面试完几家互联网企业(阿里、京东、网易、头条),总结下来面试的大体思路都基本一致。比如:
|
2天前
|
SQL 算法 安全
面试美团、头条、百度、京东,一名3年Java开发经验的面试总结
毕业转行做开发3年以来, 学到了很多, 加上自己的兴趣爱好, 个人认为已经成为了一个合格的程序员. 与刚开始找工作面试相同的是都会问一些相同的问题, 不同的是现在面试官会更注重为什么, 也就是说注重深度而非广度. 3年, 5年, 10年分别是个人从事技术方面职业规划中的一个坎, 3年大部分时间应对了业务逻辑, 培养良好的规范和思想, 基础知识还是欠缺.
|
2天前
|
消息中间件 缓存 Java
远程面试阿里、蚂蚁、京东、美团后整理份283页Java核心面试宝典
本文整理了一些面试时面试官必问的知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。
|
2天前
|
存储 算法 数据库
京东面试:说说Cookie、Session和Token的区别?
京东面试:说说Cookie、Session和Token的区别?
69 0
|
5月前
|
NoSQL 关系型数据库 MySQL
30K成功入职京东:拿到京东offer经验分享「面试经历+面试真题」
前言 ​目前很多大型互联网公司都采用线上面试的方法来挑选人才,也有很多幸运的小伙伴也是拿到大厂的offer,今天给大家分享的是我一位幸运拿到京东offer的朋友的面试经历,上周末,我也闲来无事,问到了我朋友京东面试的一些真题,以及我整理的一些真题分享给大家。
71 0
京东新招1.5W!互联网工程师Java面试知识精华已助1500人成功入职
就在上周,京东官媒宣布,2024 届校招正式启动,并且新招 15000 人。
|
8月前
|
Dubbo Java 关系型数据库
解决90%BAT大厂!京东在职大佬实测总汇“java面试真题”颠覆认知
金九银十的高峰已经到来,但现在没找到满意工作的小伙伴还是有很多。包括我的朋友因为工作上的一些小问题毅然决然的裸辞来,结果现在的就业环境弄的到现在都没找到一份合适的。面试也是一波又一波的把他打倒了。