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

 

posted @ 2017-08-30 23:20  迷路的小朋友  阅读(469)  评论(0编辑  收藏  举报