ThreadLocal使用场景及用法
ThreadLocal常用在框架中,如Struts中存储请求对象(包括请求参数、上下文环境变量), 项目中存储登录的用户信息, 在一个请求的过程中设置ThreadLocal值后,执行到其他方法时, 都可以获取设置的值
class AccountContext {
private static final ThreadLocal<Account> account = new ThreadLocal<Account>();
public static final Account getCurrentAccount() {
return account.get();
}
public static final void setCurrentAccount(Account account) {
account.set(account);
}
public static final void removeCurrentAccount() {
account.remove();
}
}
ThreadLocal、ThreadLocal.ThreadLocalMap、Thread类的关系及存取过程
1、ThreadLocalMap是ThreadLocal类的内部类,ThreadLocalMap数据结构,类似于HashMap,存储key/value,key:ThreadLocal对象, value:ThreadLocal对象存储的目标值(即上术例子中的Account对象)
2、Thread类有一成员变量,ThreadLocal.ThreadLocalMap threadLocals = null
3、threadLocal对象在执行set、get方法时,
a、获取当前线程,即:Thread.currentThread()
b、获取ThreadLocalMap, 即:上一步的currentThread.threadLocals
4、set方法
如果获取的ThreadLocalMap为空, 则创建ThreadLocalMap, 将创建的threadLocalMap赋值给当前线程的threadLocals,threadLocals中存储key:threadLocal对象, value:目标对象
5、get方法
从当前线程的threadLocalMap中获取key=threadLocal 对应的数据
ThreadLocal类的常用方法分析
1、set方法
public void set(T value) {
Thread t = Thread.currentThread();//获取当前的线程
ThreadLocalMap map = getMap(t);
if (map != null) //判断ThreadLocalMap中是否有值,如果没有,则创建ThreadLocalMap
map.set(this, value);
else
createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals; //threadLocals是Thread类的属性
}
public class Thread implements Runnable {
........
ThreadLocal.ThreadLocalMap threadLocals = null;//threadLocals类型是:ThreadLocal.ThreadLocalMap类型变量,存储类似key,value的形式数据,key:threadLocal对象,value:真正要在threadLocal中存储的数据(即目标数据)
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);//创建ThreadLocalMap对象,并将要存储的值,存储放到ThreadLocalMap中, key为ThreadLocal对象, value为thredLocal.set()方法的参数值
}
2、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();
}
相关推荐
ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案.docx
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或者提升自己技术的同学可以下载观看
JDBC事务的封装和Threadlocal实例,参考博客:http://blog.csdn.net/daijin888888/article/details/50988053
Synchronized与ThreadLocal
ThreadLocal源码分析,主要有ThreadLocal源码以及ThreadLocal的内部结构在jdk8前后的变化
ThreadLocal的基本原理,核心机制,源码,ThreadLocal在分布式架构中的应用,ThreadLocal在基础架构,开源中间件,使用非常广泛,建议掌握。