package com.example.expence.utils;
/**
* ThreadLocal 工具类
*/
public class ThreadLocalUtil {
//提供ThreadLocal对象,
private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();
//根据键获取值
public static <T> T get(){
return (T) THREAD_LOCAL.get();
}
//存储键值对
public static void set(Object value){
THREAD_LOCAL.set(value);
}
//清除ThreadLocal 防止内存泄漏
public static void remove(){
THREAD_LOCAL.remove();
}
}
每个线程都可以用ThreadLocal的set方法和get方法对某个局部变量进行操作,实现线程的数据隔离,而且取值很方便。
这也就是ThreadLocal工具类的使用场景:需要一个变量作为当前线程内全局共用,可以在不同方法内部直接使用,避免了传递参数的繁琐。(认证和授权时,user相关信息可以借此传递,在拦截器中被使用,总之它可以在一个user的所用操作中被用到)
且需注意:在最后一次使用之后要手动调用remove()方法,防止内存泄漏
在ThreadLocal源码中可以找到一个内部类ThreadLocaMap,注释也写着,它是一个定制化的HashMap
ThreadLocalMap的key为当前ThreadLocal对象,value是要存储的对象
然而在ThreadLocaMap内部还套着一个内部类Entry,它用Entry来存储
Entry还继承了WeakReference(弱引用),它继承这个所谓弱引用的意义(作用)在于:避免内存泄漏,可以要通过检查键是否被gc回收来实现.
当然就算它本身安全性较高了,用完还是得remove.