java.lang.ThreadLocal<T>,java.lang.InheritableThreadLocal<T>

*概述

---以ThreadLocal为key,实现将对象(视为value)存储在当前线程的ThreadLocalMap中,那么就不存在线程间共享信息导致的并发问题.

主要用途

1)设计线程安全的类

2)存储无需共享的线程信息

---并发中是否使用ThreadLocal,关键问题在于ThreadLocal的性能是否满足要求,性能问题主要出在实现代码中的Thread.currentThread(),

看了些文章,在jdk1.4之后,ThreadLcoal的实现得到优化,对于性能问题如何留待验证.

*源码分析

---设计思路

ThreadLocal原理

---ThreadLocalMap原理

1)对象存储位置-->当前线程的ThreadLocalMap

ThreadLocalMap是在ThreadLocal中定义的静态内部类,用于存放线程的信息,以ThreadLocal或InheritableThreadLocal为key,对象为value.

每个Thread都有两个ThreadLocalMap,如下

Thread中ThreadLocalMap

2)ThreadLocalMap,实现自定义Map,实现存储的大致原理如下

ThreadLocalMap源码

---ThreadLocal原理

ThreadLocal实现源码

注意,在new ThreadLocal时可以通过T java.lang.ThreadLocal.initialValue()定义存储的初始化对象

---InheritableThreadLocal原理

主要实现

1)覆盖ThreadLocal的方法,将存储位置定位到ThreadLocal.ThreadLocalMap inheritableThreadLocals

2)在从父线程获取inheritableThreadLocals,通过childValue定制复制的行为.

源码如下

InheritableThreadLocal源码

*参考

http://en.wikipedia.org/wiki/Thread-local_storage

http://www.javaworld.com/javaworld/jw-11-2001/jw-1116-dcl.html

http://www.ibm.com/developerworks/java/library/j-threads3/index.html(推荐阅读)

http://java.dzone.com/articles/java-thread-local-%E2%80%93-how-use?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+javalobby/frontpage+%28Javalobby+/+Java+Zone%29

posted on 2011-07-03 17:07  戴忠  阅读(1596)  评论(0编辑  收藏  举报