ThreadLocal是JDK提供的一个工具类,利用ThreadLocal,应用可以将某个值绑定到当前处理的线程上,在线程的后续处理过程中,该值可以很方便地被获取并修改。这样可以在一定程度上避免该值在方法调用中的传递。可以利用ThreadLocal保存线程执行的上下文。webwork的ActionContext就利用了ThreadLocal来保存当前Action执行的一些环境变量,所以,可以很方便地调用ActionContext.get()来得到一个与当前线程关联的ActionContext对象。
源码之前了无秘密。下面是ThreadLocal的get方法:
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
该方法首先会通过currentThread拿到当前线程对象。利用这个Thread对象,得到与这个对象关联的ThreadLocalMap,如果该map已经被初始化,则以当前的ThreadLocal对象为key,尝试从该map得到对应的value,如果返回值不是null,就返回该值,否则,调用setInitialValue方法初始化value。getMap方法给出了得到这个ThreadLocalMap的逻辑:
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
实际上,每一个Thread对象,都有一个名为threadLocals,类型为ThreadLocalMap的实例变量。每个线程对应的value保存在自身的ThreadLocalMap。
需要注意的是,ThreadLocal对象应该以static类型出现,否则的话,可能会有内存泄露。
分享到:
相关推荐
ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
ThreadLocal
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
正确理解ThreadLocal.pdf
DbUTils中用ThreadLocal类
主要介绍ThreadLocal的原理,实例分析以及注意事项
java 简单的ThreadLocal示例
ThreadLocal的几种误区ThreadLocal的几种误区ThreadLocal的几种误区
本例以序列号生成的程序为例,展示ThreadLocal的使用
ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量
详解java底层实现原理,ThreadLocal底层实现的数据结构,为什么不会导致内存泄露
设计模式及ThreadLocal详细讲解资料,想要学习java或者提升自己技术的同学可以下载观看
Synchronized与ThreadLocal
JDBC事务的封装和Threadlocal实例,参考博客:http://blog.csdn.net/daijin888888/article/details/50988053
ThreadLocal 中内存泄漏和数据丢失问题的问题浅析及解决方案 ThreadLocal 是 Java 中的一种线程本地存储机制,它可以解决线程之间的数据传递问题。然而,在使用 ThreadLocal 时,可能会出现内存泄漏和数据丢失问题...
ThreadLocal源码分析,主要有ThreadLocal源码以及ThreadLocal的内部结构在jdk8前后的变化
ThreadLocal的基本原理,核心机制,源码,ThreadLocal在分布式架构中的应用,ThreadLocal在基础架构,开源中间件,使用非常广泛,建议掌握。