好用的ThreadLocl工具

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值