controller遇到的坑

public class BaseController {

    protected HttpServletRequest request;

    protected HttpServletResponse response;

    protected HttpSession session;

    @ModelAttribute

    public void setBaseController(HttpServletRequest request, HttpServletResponse response) {

        this.request = request;

        this.response = response;

        this.session = request.getSession();

    }

}

原来为了方便,编写了这样一个基类(在方法中就不需要编写request和response参数),慢慢的发现会丢失参数。为什么呢?

答案:多线程问题, 由于controller都是单实例的,而且无状态的,所以每次都需要将参数控制在局部变量中,这样的话就不会被其他线程访问到,而现在使用了成员变量 ,多线程会变更成员变量的值,所以这里就会出现前面的参数刚接收还没处理就被替换了,如果把这里加上synchronized就可以保证成员变量的正确性了,但是如果这样做,就会降低服务器每秒处理的并发,根据http的无状态和servlet的无状态,还是乖乖的把参数写到局部变量吧。

而一个无状态的servlet既不包含任何成员变量,也不包含对其他类的成员变量的引用,

猜你喜欢

转载自dan326714.iteye.com/blog/2419859