记录一个全局共享参数的实践

通过ThreadLocal实现线程内共享参数

首先介绍一下ThreadLocal可以理解为java类中的一个线程局部变量,它可以维护一个变量,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
总结来说,同一个线程从ThreadLocal获取的变量相同,不同线程从ThreadLocal获取的变量不同,所以被ThreadLocal维护的变量无需考虑线程安全性。
适用范围:
1、 例如后端框架通过拦截器对一些参数进行处理后,得到的结果可以存入,以方便程序执行时使用,如通过Token登录后的用户对象等。
2、线程不安全的且重复创建开销较大的对象

public class ThreadLocalTest {
    private static ThreadLocal<Map<String, Object>>  threadLocal=ThreadLocal.withInitial(() -> new HashMap<>());

    public static void set(String key ,String value){
        threadLocal.get().put(key,value);
    }
    public static Object get(String key){
        return threadLocal.get().get(key);
    }
    public static Object remove(String key){
        return threadLocal.get().remove(key);
    }
}

通过LoadingCache实现全局参数共享

我们最常用的缓存库应该是redis,但是,有时候我们并不一定需要如此正规的缓存,我们可能只需要在java内部运行的缓存即可,恰好,谷歌公司的guava框架可以很好地满足我们的需求,他是基于原生java的强化,相对比较实用,我们使用这个框架中的缓存框架LoadingCache对象。

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.0-jre</version>
        </dependency>

首先初始化该对象

    private static final LoadingCache<String, String> cache = CacheBuilder.newBuilder()
            .expireAfterWrite(10, TimeUnit.HOURS)
            .recordStats()   //开启 记录状态数据功能
            .build(new CacheLoader<String, String>() {
                @Override
                public String load(String key) throws Exception {
                    return "";
                }
            });

然后封装一个get和put方法

    public static void put(String token, String userId) {
        cache.put(token, userId);
    }

    public static String get(String token) {
        try {
            return cache.get(token);
        } catch (ExecutionException e) {
            throw new RuleException(e.getMessage(), 1012);
        }
    }

这样就可以在java内部实现一个基本的缓存功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值