Java ThreadLocal.
《阿里巴巴 Java 开发手册》中对 ThreadLocal 的使用有如下规定:
【强制】必须回收自定义的 ThreadLocal 变量,尤其在线程池场景下,线程经常会被复用,如果不清理自定义的 ThreadLocal 变量,可能会影响后续业务逻辑和造成内存泄露等问题。尽量在代理中使用 try-finally 块进行回收。
正例:
1
2
3
4
5
6
7 > objectThreadLocal.set(userInfo);
> try {
> // ...
> } finally {
> objectThreadLocal.remove();
> }
>【参考】ThreadLocal 对象使用 static 修饰,ThreadLocal 无法解决共享对象的更新问题。
说明:这个变量是针对一个线程内所有操作共享的,所以设置为静态变量,所有此类实例共享此静态变量,也就是说在类第一次被使用时装载,只分配一块存储空间,所有此类的对象(只要是这个线程内定义的)都可以操控这个变量。
ThreadLocal 中有一个内部类 ThreadLocalMap
可能的内存泄漏问题
其实 ThreadLocal
这个类已经考虑到了可能的内存泄漏问题。所以其内部使用到了弱引用。在好几个操作中也会对进行操作防止内存泄漏。
InheritableThreadLocal
ThreadLocal 的一个子类,用于子线程获取父线程的 ThreadLocal 变量。