专栏文章 HeroTestly 框架设计

CC · 2019年04月08日 · 最后由 CC 回复于 2019年04月08日 · 2912 次阅读

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 6 条回复 时间 点赞

举例说明一下,使用 ThreadLocal 存储多接口公用数据的场景来

CC #2 · 2019年04月08日 Author
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 是多个线程一起跑的时候,对同一个变量,每个线程希望有自己的一份数据时,才用到。

CC #3 · 2019年04月08日 Author
bauul 回复

哈哈,果果,从你的回答就看到你确实没体会其中妙处,全局 map 定义这种尤其还不是静态变量,在编程规范是尽量避免的,threadloal 等于在本次业务请求处理中,是个全局临时变量,线程执行完成,自动销毁 threadlocal,这个在支付业务中,有很广的应用,可以作为订单处理异常的时候,资金解冻等相关处理

CC 回复

是啊,上面提到的场景,不是有先后关系吗?也不存在并发执行,所以根本不需要用 ThreadLocal,给我的感觉,就是为了用而用啊。至于支付业务中的应用,得看具体场景,再具体一点,嘿嘿

CC #6 · 2019年04月08日 Author
bauul 回复

😁😁😁我就是想减少一个入参处理,用 threadlocal 比较多,尤其在自定义注解这块;支付业务我是看我们服务实现处理,😄,用的比较漂亮

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册