ThreadLocal理解
ThreadLocal.java
// ThreadLocal.java
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
看一下getMap源码
// ThreadLocal.java
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
看一下t.threadLocals
// Thread.java
/* ThreadLocal values pertaining to this thread. This map is maintained 维护 by the ThreadLocal class. */
ThreadLocal.ThreadLocalMap threadLocals = null;
可以发现map其实是由Thread持有的。这也就不难理解为什么一个线程set之后,另一个线程get不到。
ThreadLocal 的作用
ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。
ThreadLocal的应用场景
hreadLocal使用场景为用来解决数据库连接、Session管理、配合Spring MVC拦截器(登陆拦截器),判断用户是否登录。