zoukankan      html  css  js  c++  java
  • 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永远不会被回收,长期后,造成内存泄露的可能性很大。

  • 相关阅读:
    JSP_core
    J2EE_Servlet——helloworld
    JS_对象原型链
    JDBC_Hive & coding
    Python错误——TypeError: 'NoneType' object is not iterable
    Python错误——TypeError: is_leap_year() takes 0 positional arguments but 1 was given
    python错误:sh: cls: command not found
    Git——版本控制系统
    samba服务器搭建+权限设置
    windows10 samba 安全策略无法访问
  • 原文地址:https://www.cnblogs.com/guoliangxie/p/7455946.html
Copyright © 2011-2022 走看看