好用的ThreadLocl工具

package com.example.expence.utils;

/**
 * ThreadLocal 工具类
 */
public class ThreadLocalUtil {
    //提供ThreadLocal对象,
    private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();

    //根据键获取值
    public static  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()方法,防止内存泄漏

好用的ThreadLocl工具_第1张图片

在ThreadLocal源码中可以找到一个内部类ThreadLocaMap,注释也写着,它是一个定制化的HashMap

ThreadLocalMap的key为当前ThreadLocal对象,value是要存储的对象

然而在ThreadLocaMap内部还套着一个内部类Entry,它用Entry来存储

Entry还继承了WeakReference(弱引用),它继承这个所谓弱引用的意义(作用)在于:避免内存泄漏,可以要通过检查键是否被gc回收来实现.

当然就算它本身安全性较高了,用完还是得remove.

你可能感兴趣的:(项目心得,java)