前言
本文是对 前文的更深入的说明 建议就查看本篇文章 让你彻底弄懂ThreadLocal可以使用在哪些场景下使用:
【ThreadLocal实践一】带你用实际的业务去理解ThreadLocal的使用以及缓存的思想 - 优快云 App
ThreadLocal 实现了「线程隔离」 每个线程拥有自己独立的「存储空间」来记录与某个 ThreadLocal 相关联的值。
该怎样去利用这个特性在多线程编程下?
场景一:存储业务上下文需要频繁查库的数据
业务背景: 在一个会话中批量下1000个订单 每一个订单信息都需要校验相同的信息:例如
1、1000个订单的【银行账户】是否一致
2、1000个订单的【收款人】是否一致
3、1000个订单的【订单地址】是否一致
如何做到缓存重复的校验信息?
//part1: 定义缓存的对象 账户 收款人 地址
// 每一个map中key为BankAccount、Receiver、Address的id
// 每一个map中的value为id对应的值
public class Cache {
// 重要:设置为final 和 @Getter代表是只读的属性
@Getter
private final Map<String, BankAccount> bankAccountCache = new HashMap<>();
@Getter
private final Map<String, Receiver> receiverCache = new HashMap<>();
@Getter
private final Map<String, Address> addressCache = new HashMap<>();
}
//part2: 定义存放缓存的ThreadLocal的工具类context(可以理解存放缓存的地方)
// 缓存上下文
public class CacheContext {
//重要:static final 使得只有一个ThreadLocal
private static final ThreadLocal<Cache> CACHE = new ThreadLocal<>();
/**
* 初始化缓存,使得仅第一次调用返回cache,