转载文章时务必注明原作者及原始链接,并注明「发表于 TesterHome 」,并不得对作品进行修改。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
举例说明一下,使用 ThreadLocal 存储多接口公用数据的场景来
对
bauul
回复
已经在应用了,给你段处理代码给你看下,拿来即用
public class DynamicLocalHolder {
public static final ThreadLocal<Map<String,Object>> hodler = new ThreadLocal<>();
public static Map<String,Object> get(){
return hodler.get();
}
public static void set(Map<String,Object> map){
hodler.set(map);
}
public static void set(String key,Object value){
Map<String,Object> map = hodler.get();
if(map == null){
map = Maps.newHashMap();
}
map.put(key,value);
set(map);
}
public static void clean(){
hodler.remove();
}
}
前一个接口设置值:
if(CollectionUtils.isNotEmpty(teacherQAResponseList)){
DynamicLocalHolder.set("teacherQAResponseList",teacherQAResponseList);
}
后一个接口获取值:
/**
* 设置讲师问答
*/
private void setTeacherQA(CreateCourseItemRequest createCourseItemRequest){
if(DynamicLocalHolder.get().containsKey("teacherQAResponseList")){
List<TeacherQAResponse> teacherQAResponseList = (List<TeacherQAResponse>) DynamicLocalHolder.get().get("teacherQAResponseList");
List<TeacherQARequest> teacherQARequestList = Lists.transform(teacherQAResponseList, new Function<TeacherQAResponse, TeacherQARequest>() {
@Override
public TeacherQARequest apply(TeacherQAResponse teacherQAResponse) {
TeacherQARequest teacherQARequest = new TeacherQARequest();
BeanUtils.copyProperties(teacherQAResponse,teacherQARequest);
return teacherQARequest;
}
});
createCourseItemRequest.setTeacherQAList(teacherQARequestList);
}
}
对
CC
回复
这个感觉用一个全局 Map 就可以了啊,还是没领会到用 ThreadLocal 的好处。
据我理解,ThreadLocal 是多个线程一起跑的时候,对同一个变量,每个线程希望有自己的一份数据时,才用到。
对
bauul
回复
哈哈,果果,从你的回答就看到你确实没体会其中妙处,全局 map 定义这种尤其还不是静态变量,在编程规范是尽量避免的,threadloal 等于在本次业务请求处理中,是个全局临时变量,线程执行完成,自动销毁 threadlocal,这个在支付业务中,有很广的应用,可以作为订单处理异常的时候,资金解冻等相关处理
对
CC
回复
是啊,上面提到的场景,不是有先后关系吗?也不存在并发执行,所以根本不需要用 ThreadLocal,给我的感觉,就是为了用而用啊。至于支付业务中的应用,得看具体场景,再具体一点,嘿嘿
对
bauul
回复
😁😁😁我就是想减少一个入参处理,用 threadlocal 比较多,尤其在自定义注解这块;支付业务我是看我们服务实现处理,😄,用的比较漂亮