并发与高并发课程学习笔记(5)

通过将对象改变成不可见对象,来保证线程安全。但是这样是躲避并发问题,除了不可见对象,还有一种解决办法 “线程封闭”

1.ad-hoc: 代码控制实现,最糟糕,这里忽略

2.堆栈封闭: 局部变量,无并发问题(高并发下,全局变量容易引起并发问题,所以能用局部变量就用局部变量)

3.threadlocal线程封闭: 特别好的封闭方法.

这里顺便写一下SpringBoot下拦截器filter的示例

public class HttpFilter implements Filter {

@Override

    public void init(FilterConfig filterConfig)throws ServletException {

}

@Override

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {

//强转servletRequest为HttpServletRequest

        HttpServletRequest request = (HttpServletRequest)servletRequest;

//获取session中的值

//        request.getSession().getAttribute("user");

        Cookie[] cookies = request.getCookies();

for(Cookie cookie: cookies){

//do something...

        }

RequestHolder.add(Thread.currentThread().getId());

//保证拦截器拦截后,请求继续执行

        filterChain.doFilter(servletRequest,servletResponse);

}

@Override

    public void destroy() {

}

}


需要在启动类中注册拦截器

@Bean

public FilterRegistrationBean httpFilter(){

FilterRegistrationBean registrationBean =new FilterRegistrationBean();

registrationBean.setFilter(new HttpFilter());

registrationBean.addUrlPatterns("/threadLocal/*");

return registrationBean;

}


这里如果是多个拦截器可以写多个bean用setOrder(Integer orderNum)来控制,小的先执行


这里是监听器的示例

public class HttpInterceptor  extends HandlerInterceptorAdapter{

@Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {

log.info("prehandl");

return true;

}

@Override

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {

RequestHolder.remove();

log.info("afterCompletion");

return;

}

}

启动类需要注册

@Configuration

static class WebMvcConfigimplements WebMvcConfigurer {

    @Override

    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(new HttpInterceptor()).addPathPatterns("/**");

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,828评论 19 139
  • 本文包括:1、Filter简介2、Filter是如何实现拦截的?3、Filter开发入门4、Filter的生命周期...
    廖少少阅读 12,084评论 3 56
  • 监听器(listener) 监听器简介 :监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个...
    奋斗的老王阅读 7,347评论 0 53
  • Servlet Interface 是Java Servlet API的核心抽象。所有的servlets都直接或者...
    Lucky_Micky阅读 5,707评论 2 2
  • 1. iBeacon的使用 1、iBeacon的使用是基于蓝牙和定位的,所以我们需要先到入两个库: 在iOS8之后...
    Mystical阅读 11,874评论 8 9

友情链接更多精彩内容