ThreadLocal
廖雪峰官网 - 使用ThreadLocal
- 总结:可以把
ThreadLocal
看成一个全局Map<Thread, Object>
:每个线程获取ThreadLocal变量
时,总是使用Thread自身
作为key:Object threadLocalValue = threadLocalMap.get(Thread.currentThread());
因此,ThreadLocal
相当于给每个线程都开辟了一个独立的存储空间,各个线程的ThreadLocal关联的实例
互不干扰。
remove方法
是如果ThreadLocal
没有被清除,该线程执行其他代码时,会把上一次的状态带进去。 - 可以用Java新特性来实现自动关闭
public class UserContext implements AutoCloseable {
private ThreadLocal<String> ctx = new ThreadLocal<String>();
public UserContext(String user) {
ctx.set(user);
}
public static String currentUser() {
return ctx.get();
}
@Override
public void close() {
ctx.remove();
}
}
try (ThreadLocal ctx = new UserContext("Bob")) {
String currentUser = UserContext.currentUser();
} catch(Exception e) {
e.printStackTrace();
}
- 这样就在
UserContext
中完全封装了ThreadLocal
,外部代码在try (resource) {...}
内部可以随时调用UserContext.currentUser()
获取当前线程绑定的用户名
。