ThreadLocal

 面试题:谈一谈对ThreadLocal的理解

        1.ThreadLocal可以实现【资源对象】的线程隔离,让每个线程各用各的【资源对象】,避免
        争用引发的线程
        2.ThreadLocal同时实现了线程内的资源共享
        3.其原理是,每个线程内有一个ThreadLocalMap类型的成员变量,用来存储资源对象
                调用set方法,就是以ThreadLocal自己作为key,资源对象作为value,放入当前线程的
        ThreadLocalMap集合中
                调用get方法,就是以ThreadLocal自己作为key,到当前线程中查找关联的资源值
                调用remove方法,就是以ThreadLocal自己作为key,移除当前线程关联的资源值
        4.为什么ThreadLocalMap中的key(即ThreadLocal)要设计为弱引用?
                ①Thread可能需要长时间运行(如线程池中的线程),如果key不再使用,需要在内存不足
        (GC)时释放其占用的内存
                ②但GC仅是让key的内存释放,后续还要根据key是否为null来进一步释放值的内存,释
        放时机有
                        a) 获取key发现null key 
                        b) set key 时,会使用启发式扫描,清除临近的null key,启发次数与元素个数,是
        否发现null key有关
                        c)remove时(推荐),因为一般使用ThreadLocal时都把它作为静态变量,因此GC无
        法回收

ThreadLocal内存泄漏尽可能最全总结_万般努力,只为出人头地的博客-CSDN博客_threadlocal的内存泄露ThreadLocal内存泄漏实线代表强引用,虚线代表弱引用每一个Thread线程都会维护一个ThreadLocalMap它是线程独有的哦! key为使用弱引用的ThreadLocal实例,value作为线程变量的副本。强引用,使用最普遍的引用,一个对象具有强引用,不会被垃圾回收器回收。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不回收这种对象。如果想取消强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样可以使JVM在合适的时间就会回https://blog.csdn.net/qq_51936245/article/details/121550245?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1-121550245-blog-122143262.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1-121550245-blog-122143262.pc_relevant_aa&utm_relevant_index=1​​​​​​​为什么ThreadLocalMap中把ThreadLocal对象存储为Key时使用的是弱引用_JinF~的博客-CSDN博客为什么ThreadLocalMap中把ThreadLocal对象存储为Key时使用的是弱引用​一般来说使用ThreadLocal时会有两个引用指向ThreadLocal对象,一个是创建ThreadLocal对象时的显式的引用(下文称为显式引用),还有一个就是ThreadLocalMap对ThreadLocal对象的弱引用,当我们不再使用ThreadLocal时,显式引用不再指向ThreadLocal对象。这时只有ThreadLocalMap对ThreadLocal对象的弱引用存在。假设ThreadLohttps://blog.csdn.net/hjfalz/article/details/117914630?ops_request_misc=&request_id=&biz_id=102&utm_term=%E4%B8%BA%E4%BB%80%E4%B9%88ThreadLocalMap%E7%9A%84key%E8%A6%81%E8%AE%BE%E8%AE%A1%E6%88%90%E5%BC%B1%E5%BC%95%E7%94%A8&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-117914630.142%5Ev18%5Epc_search_result_control_group,157%5Ev15%5Enew_3&spm=1018.2226.3001.4187

拼多多面试官没想到ThreadLocal我用得这么溜,人直接傻掉_敖 丙的博客-CSDN博客面了三次了,总算虐了一次面试官了https://blog.csdn.net/qq_35190492/article/details/107599875?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165573181716781435452957%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165573181716781435452957&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-107599875-null-null.142%5Ev18%5Epc_search_result_control_group,157%5Ev15%5Enew_3&utm_term=ThreadLocal&spm=1018.2226.3001.4187ThreadLocal 是什么?有哪些使用场景?_ConstXiong的博客-CSDN博客_threadlocal是什么ThreadLocal 是什么?有哪些使用场景?ThreadLocal 是线程本地存储,在每个线程中都创建了一个 ThreadLocalMap 对象,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。经典的使用场景是为每个线程分配一个 JDBC 连接 Connection。这样就可以保证每个线程的都在各自的 Connection 上进行数据库的操作,不会出现...https://blog.csdn.net/meism5/article/details/90413860?ops_request_misc=&request_id=&biz_id=102&utm_term=ThreadLocal&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-90413860.142%5Ev18%5Epc_search_result_control_group,157%5Ev15%5Enew_3&spm=1018.2226.3001.4187


版权声明:本文为TIANJIAWEN原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。