• ThreadLocal的底层原理


    ThreadLocal的基本使用

    创建一个ThreadLocal对象:

    private ThreadLocal<Integer> localInt = new ThreadLocal<>();
    

    上述代码创建一个localInt变量,由于ThreadLocal是一个泛型类,这里指定了localInt的类型为整数。

    下面代码是如果设置和获取这个变量的值:

    1. public int setAndGet(){
    2. localInt.set(8);
    3. return localInt.get();
    4. }

    上述代码设置变量的值是8,接着取得这个值。

    由于ThreadLocal里设置的值,只有当前线程自己看得见,这意味着你不可能通过其他线程为它初始化值。为了弥补这一点,ThreadLocal提供了一个withInitial()方法统一初始化所有线程的ThreadLocal的值:

    private ThreadLocal<Integer> localInt = ThreadLocal.withInitial(() -> 6);
    

    上述代码将ThreadLocal的初始值设置为6,这对全体线程都是可见的。

    1. ThreadLocal 是 java 中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻、任意方法中获取缓存的数据

    2. ThreadLocal 底层是通过 ThreadLocalMap 来实现,每个 Thread 对象(注意不是 ThreadLocal对象)中都存在一个 ThreadLocalMap,Map 的 key 为 ThreadLlocal 对象,Map 的Value 为需要缓存的值

    3. 如果在线程池中使用 ThreadLocal 会造成内部泄露,因为当 ThreadLocal 对象使用完之后,应该要把设置的 Key ,Value ,也就是Entry 对象进行回收,但线程池中的线程不会回收,而线程对象是通过强引用指向 ThreadLocalMap ,ThreadLocalMap 也是通过强引用指向Entry对象,线程不被回收,Entry对象也就不会回收,从而出现内存泄露,解决办法是在使用ThreadLocal 对象之后,手动调用ThreadLocal 的remove 方法,手动清除Entry对象

    4. ThreadLocal 经典的应用场景就是连接管理(一个线程持有一个连接,该连接对象可以在不同的方法之间进行传递,线程之间不共享同一个连接)


    以上是简单描述ThreadLocal的底层,后面会继续讲述 ThreadLocal 实现原理分析,请大家多多指导,谢谢

  • 相关阅读:
    学习OpenCV——cv::inpaint函数(三)
    python基于django的读书笔记共享平台
    主数据管理理论与实践
    基于jsp+mysql+ssm进销存管理系统-计算机毕业设计
    使用cpp-httplib 进行HTTPS 对接开发
    c语言求三角形的面积
    如何进行测试分析与设计-HTSM启发式测试策略模型 | 京东云技术团队
    vm.$set函数的个人总结
    PC机与服务器通讯
    我做了一个在线白板(二)
  • 原文地址:https://blog.csdn.net/wm31898/article/details/127931027