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精髓,学而时习之,不亦说乎。另外线程缓存,可用但是慎思慎用。

你可能感兴趣的:(Java)