下载此文档

聊一聊ThreadLocal.pdf


文档分类:医学/心理学 | 页数:约11页 举报非法文档有奖
1/11
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/11 下载此文档
文档列表 文档介绍
: .
alMap map = getMap(t); if (map != null)
{ e = (this);
if (e != null) return (T); }
return setInitialValue(); } ThreadLocalMap
getMap(Thread t) { return ; }
get()方法的源码如上所示,可以看到 map 中真正的 key 是线
程 ThreadLocal 实例本身( e =
(this);中的 this)。可以看一下
getEntry(ThreadLocal key)的源码.
【代码 4】
private Entry getEntry(ThreadLocal key) { int i =
& ( - 1);Entry e = table[i]; if (e != null && () == key)
return e; else return
getEntryAfterMiss(key, i, e); }
那么 map 中的 value 是什么呢?我们继续来看源码:
【代码 5】
private T setInitialValue() { T value = initialValue();
Thread t = (); ThreadLocalMap
map = getMap(t); if (map != null)
(this, value); else createMap(t,
value); return value; } protected T initialValue()
{ return null; }
代码 5 中只能够观察到通过[protected T initialValue()]方法设
置了一个初始值,当然也可以通过 set 方法来赋值,继续看
源码:
【代码 6】
public void set(T value) { Thread t =
(); ThreadLocalMap map =
getMap(t); if (map != null) (this,
value); else createMap(t, value); }
ThreadLocal 设置值有两种方案:1. Override 其 initialValue 方
法;2. 通过 set 设置。
关于重写 initialValue 方法可以参考下面这个例子简便的实现:
【代码 7】
private static final ThreadLocal TIME_THREADLOCAL = new
ThreadLocal(){ ***@Override protected Long
initialValue() { return
(); } };
内存泄露
通过代码 1 和代码 2 的片段可以看出,在 Thread 类中保有
的引用,即在一个 Java 线程栈
中指向了堆内存中的一个 的对
象,此对象中保存了若干个 Entry,每个 Entry 的
key(ThreadLocal 实例)是弱引用,value 是强引用(这点类似
于 WeakHashMap)。
用到弱引用的只是 key,每个 key 都弱引用指向 threadLocal,
当把 threadLocal 实例置为 null 以后,没有任何强引用指向
threadLoca

聊一聊ThreadLocal 来自淘豆网m.daumloan.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数11
  • 收藏数0 收藏
  • 顶次数0
  • 上传人小屁孩
  • 文件大小225 KB
  • 时间2022-07-27