首页 > 其他分享 >Threadlocal

Threadlocal

时间:2023-08-18 20:34:42浏览次数:32  
标签:get 清理 ThreadLocal ThreadLocalMap Threadlocal 线程 key

一:Threadlocal的key是弱引用,那么在Threadlocal.get() 的时候,发生GC之后,key 否为nul!?

答:在ThreadLocal中,key是使用弱引用的。在执行ThreadLocal.get()方法时,如果发生了垃圾回收(GC),对应的key会自动被回收,并在下一次ThreadLocal操作时被剔除

 

二:ThreadLocal中ThreadLocalMap 的数据结构?

ThreadLocalMap是ThreadLocal类的内部静态类,它是一个自定义的哈希表,用于存储每个线程的ThreadLocal变量和对应的值。


三:ThreadLocalMap的Hash算法?

ThreadLocalMap是ThreadLocal类的内部静态类,它是一个自定义的哈希表,用于存储每个线程的ThreadLocal变量和对应的值。


四:ThreadLocalMap中Hash冲突如何解决?

当出现ThreadLocalMap中的Hash冲突时,采用开放地址法进行解决。即会顺序查找哈希桶,直到找到一个空的位置或者找到匹配的key。


五:ThreadLocalMap的扩容机制?

ThreadLocalMap的扩容机制是,当当前存储的元素数量超过阈值时,会调用rehash()方法进行扩容。扩容后,将所有数据重新哈希到新的桶中。


六:ThreadLocalMap中过期key的清理机制?探测式清理和启发式清理流程?

ThreadLocalMap中过期key的清理机制包括探测式清理和启发式清理两个步骤。探测式清理是在set、get或remove时判断key是否过期,并进行清除。启发式清理是在调用ThreadLocalMap的set、get或remove方法时,如果发现已经存在过期的key,会立即进行一轮清理


七:ThreadLocalMap. set()方法实现原理?

ThreadLocalMap的set()方法实现原理是,先获取当前线程的ThreadLocalMap对象,然后以自身作为key,要设置的值作为value,将其存入ThreadLocalMap中。


八:ThreadLocalMap. get()方法实现原理?

ThreadLocalMap的get()方法实现原理是,先获取当前线程的ThreadLocalMap对象,再以自身作为key,从ThreadLocalMap中获取对应的值。


九:项目中ThreadLocal使用情况?遇到的坑?

在项目中,ThreadLocal常用于保存线程上下文信息,如用户身份、请求信息等。但需要注意的是,使用ThreadLocal时需避免内存泄漏问题,即在使用完毕后及时清理ThreadLocal的引用,以防止长时间持有对象导致对象无法被回收的情况。另外,多线程环境下使用ThreadLocal时需注意线程安全性和数据一致性的问题,避免出现数据错乱或冲突的情况。

标签:get,清理,ThreadLocal,ThreadLocalMap,Threadlocal,线程,key
From: https://www.cnblogs.com/jinfangwei/p/17641542.html

相关文章

  • ThreadLocal的作用以及其存在的问题
    ThreadLocal是JDK自带的一个类,他的作用是为每个线程中创建专属本地变量,这些变量只能被当前线程访问和修改,其他线程无法访问,当你创建了一个ThreadLocal里的变量后,每个访问这个变量的线程都会获得一个此变量的本地副本,同时THreadLocal提供了get()、set()方法来获取默认值,或将其值更......
  • 数据库连接池为什么要用threadlocal呢?不用会怎样?
    数据库连接池使用ThreadLocal的主要原因是为了保证每个线程都有其独立的数据库连接,这样可以避免多个线程之间的连接干扰,提高系统的稳定性和性能。为什么使用ThreadLocal?线程安全:ThreadLocal可以为每个线程提供一个独立的数据库连接,确保多个线程操作数据库时不会出现资源竞争的......
  • ThreadLocal的学习心得
    ThreadLocal是Java提供的线程本地存储机制,可以实现多线程环境下数据的隔离。主要特点是:每个线程都有自己的实例副本,实现了线程的数据隔离。ThreadLocal中存储的值对其他线程都不可见。通过get()和set()来读写当前线程的实例副本,避免了线程安全问题。本地线程副本通过弱......
  • 自定义实现可跨线程(线程池)的ThreadLocal
    packageTest0814;importcom.google.common.collect.Maps;importjava.util.HashMap;importjava.util.Map;importjava.util.WeakHashMap;publicclassMyThreadLocal<T>extendsInheritableThreadLocal<T>{//方法1publicstaticfinalInherita......
  • 使用 transmittable-thread-local 组件解决 ThreadLocal 父子线程数据传递问题
    在某个项目中,需要使用mybatis-plus多租户功能以便数据隔离,前端将租户id传到后端,后端通过拦截器将该租户id设置到ThreadLocal以便后续使用,代码大体上如下所示:ThreadLocal<Integer>threadLocal=newInheritableThreadLocal<>();threadLocal.set(1);Java 我在Controlle......
  • 谈谈对TransmittableThreadLocal的理解
    前言最近遇到一个问题,公司内部有一个公共的SSO包,用来获取HTTP请求中的登录态,代码中会直接用这个包的方法获取用户登录信息,在代码任意位置直接用SSOUtil.getUser()获取用户信息,在我们一个下载的业务代码中,用到了线程池开启子任务处理请求,结果发现子任务中拿到的用户信息和HTTP请......
  • 线程池使用InheritableThreadLocal踩坑总结
    一、缘起某天测试环境更新后,有小伙伴反应页面会随机性的发生请求参数为空的情况(request.getParamter为空),但是前端的参数是传了的,而且不能稳定重现,需要在页面上经过一番操作之后才会发生,而当问题重现之后,之前那些可用的页面就变得不可用了,然后就会在可用和不可用之间交替........
  • 异步线程变量传递必知必会---InheritableThreadLocal及底层原理分析
    InheritableThreadLocal简介笑傲菌:多线程热知识(一):ThreadLocal简介及底层原理3赞同·0评论文章上一篇文章我们聊到了ThreadLocal的作用机理,但是在文章的末尾,我提到了一个问题,ThreadLocal无法实现异步线程变量的传递。什么意思呢?以下面的代码为例子:@SneakyThrowspublicBo......
  • ThreadLocal实践案例两则
    ThreadLocal是Java中的一个类,全路径:java.lang.ThreadLocal,用于在多线程环境下存储线程本地变量。在多线程应用程序中,不同线程之间共享数据可能会引发线程安全问题。ThreadLocal通过为每个线程创建独立的变量副本,保证了线程间数据的隔离性,从而有效地解决了这一问题。线程之间的数据......
  • 一文让你彻底掌握ThreadLocal
    本文分享自华为云社区《【高并发】一文带你彻底搞懂ThreadLocal》,作者:冰河。我们都知道,在多线程环境下访问同一个共享变量,可能会出现线程安全的问题,为了保证线程安全,我们往往会在访问这个共享变量的时候加锁,以达到同步的效果,如下图所示。对共享变量加锁虽然能够保证线程的安全,但......