ThreadLocal 用法详解

ThreadLocal 是用于缓存单个线程的共享变量,线程之间不能互相访问,可以很好的防止多线程中调用静态变量出现不可挽回的惨案

方法调用

get()

获取ThreadLocal中当前线程共享变量的值

set()

设置ThreadLocal中当前线程共享变量的值

remove()

移除ThreadLocal中当前线程共享变量的值

initialValue()

ThreadLocal没有被当前线程赋值时或当前线程刚调用remove方法后调用get方法时,此方法初始化当前线程后 返回初始化值 一般用来在使用时重写此方法

实例参考:应用实例

弱引用问题

关于ThreadLocalMap<ThreadLocal, Object>弱引用问题

问题分析

当线程没有结束,但是ThreadLocal已经被回收,则可能导致线程中存在ThreadLocalMap<null, Object>的键值对,造成内存泄露。(ThreadLocal被回收,ThreadLocal关联的线程共享变量还存在)。

虽然ThreadLocal的get,set方法可以清除ThreadLocalMap中key为null的value,但是get,set方法在内存泄露后并不会必然调用

解决方法

1、使用完线程共享变量后,显示调用ThreadLocalMap.remove方法清除线程共享变量;

2、JDK建议ThreadLocal定义为private static,这样ThreadLocal的弱引用问题则不存在了。

本文参考 coshaho


   版权声明:本文为原创文章,版权归本站所有,欢迎分享本文,转载请保留出处!

发表留言

人生在世,错别字在所难免,无需纠正。

icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif