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精髓,學而時習之,不亦說乎。另外線程緩存,可用但是慎思慎用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章