(5)ThreadLocal类及应用技巧

java.lang
类 ThreadLocal<T>


java.lang.Object
java.lang.ThreadLocal<T>
直接已知子类:
InheritableThreadLocal


public class ThreadLocal<T>extends Object该类提供了线程局部 (thread-local) 变量。


这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。


ThreadLocal 实例通常是类中的 private static 字段,

它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。


例如,以下类生成对每个线程唯一的局部标识符。线程 ID 是在第一次调用 UniqueThreadIdGenerator.getCurrentThreadId() 时分配的,在后续调用中不会更改。





每个线程都保持对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;

在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。





结果:

Thread-0 has put data :1365978062
A form Thread-0 get data :1365978062
Thread-1 has put data :-770297261
A form Thread-1 get data :-770297261
B form Thread-1 get data :-770297261
B form Thread-0 get data :1365978062

如果 线程范围内 有 N个变量 那应该怎么办呢??一个 threadLocal代表一个变量,

故其中里只能放一个数据。你有两个变量都要线程范围内共享,则要定义两个threadLocal对象,

如果有一百个变量要线程共享呢?那请先定义一个对象来装这一百个变量,然后在threadLocal中存储这个对象。



Thread-0 has put data :-485439611
Thread-1 has put data :198643933
A form Thread-0 get data :-485439611
A form Thread-0 getMyData : name -485439611,-485439611
A form Thread-1 get data :198643933
A form Thread-1 getMyData : name 198643933,198643933
B form Thread-1 get data :198643933
B form Thread-0 get data :-485439611



一中 更加优雅的写法:



更多 threadLocal 借鉴:

http://blog.csdn.net/qjyong/article/details/2158097

http://www.iteye.com/topic/103804

你可能感兴趣的:(threadLocal)