ThreadLocal线程缓存踩坑笔记

看一场戏,听一场雨,真是有趣。

主角之一:主线程缓存ThreadLocal上下文
ThreadLocal<SomeContext> someContext = new ThreadLocal<>();
String someToken = someContext.getToken();
String someAccountNo = someContext.getAccountNo();
主角之二:多线程登场 —— 注意ATask和BTask子线程会新开辟线程上下文,因此子线程内someContext为空
ExecutorService executor = new ThreadPoolExecutor();
ATask = executor.submit(() -> {
	aClient.getServive;
}

BTask = executor.submit(() -> {
	bClient.getSevrive;
}

if (StringUtil.isNotBlank(someContext.getToken())) {
	// 如果还是主线程,someContext不为空,则会进入这个分支
	addSomeToken2Message(更好玩的在这里);
} else {
	// 如果是子线程,someContext为空,则会进入这个分支
}
主角之三:BeanUtils.copyPropertiesToMap,request为Map类型时,不能Map copy to Map? 还要踩多少坑才肯从入门到放弃?
private void addSomeToken2Message(Object request, SomeMessage someMessage) {
	Map<String, Object> requestMap = new HashMap<>(16);
	BeanUtils.copyPropertiesToMap(request, "", requestMap);
	requestMap.put(Constant.SOME_TOKEN_KEY, someContext.getToken());
	transformMessage(...);
}

反思:

  1. 先把边界理清楚,心态放平别着急,拿到真凭实据,白纸黑字,实事求是,终会守得云开见月明。
  2. Java功底任何时候都不能落下,多线程是Java精髓,学而时习之,不亦说乎。另外线程缓存,可用但是慎思慎用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值