通过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内部实现一个基本的缓存功能