• ThreadLocal了解


      ThreadLocal在项目中应该都会遇到,简单的理解就是线程私有的?那么如何实现的呢?

    一、实现

      Threadlocal是绑定在线程上的,可以看到Thread类中有一个属性是ThreadLocal中的一个内部类ThreadLocalMap.

      

      什么时候会对这个属性赋值呢?当new一个ThreadLocal的时候后,调用set方法或者setInitialValue方法的时候,会调用createMap方法,createMap方法则是为当前线程的threadlocals属性赋值,代码如下:

      map中有一个entry,key为当前threadlocal,value则为设置的值,也就是说一个thread的map属性可以有多个threadlocal,并且是通过健值来维护的。

    二、Threadlocal的生命周期:

      1、随着threadlocal的new产生,随着线程的总结而结束

      2、随着threadlocal的new产生,随着调用remove方法而结束

    三、threadlocal注意点:

      threadlocal可能有一种情况有机会会发生内存泄露问题。看下threadlocalmap的源码:

    可以看到key的threadlocal是一个弱引用,对于jvm,引用有四种类型:强、软、弱、虚,弱引用在jvm发生gc的时候,无论什么情况都会被直接回收。这里就有个问题,如果gc后,key被回收掉变为空,但是value依然存在,也永远用不到,造成了资源浪费。当然在类中的get和set的时候(实现在threadlocalmap中的getentry和set中),如果有空key则会删除对应entry,所以如果调用了remove、get、set或者线程直接结束,这种内存泄露都是不会出现的。

    上面的情况一般不会出现内存泄露,但是如果在使用线程池的时候,如果线程使用完毕不回收,放回池中,正好有没有调用remove、get、set方法,那么value永远不会被回收,长期后,造成内存泄露的可能性很大。

  • 相关阅读:
    python虚拟环境使用
    虚拟化网络进阶管理
    虚拟化进阶管理
    KVM虚拟化
    Xen虚拟化
    Virtualization基础
    Virnish使用
    CentOS配置FTP服务器
    Ajax结合Json进行交互数据(四)
    将 数据库中的结果集转换为json格式(三)
  • 原文地址:https://www.cnblogs.com/guoliangxie/p/7455946.html
Copyright © 2020-2023  润新知