StringBuffer vs servlet过滤器中的StringBuilder

时间:2014-06-02 05:47:05

标签: java multithreading servlets servlet-filters

我知道在servlet过滤器中我们应该注意我们的instace varibles的线程安全性,但是在下面的代码中,我使用了stringBuilder和stringBuffer(一个线程安全,一个没有)。

public class ValidationFilter  implements Filter {
    //thread safe
   // StringBuffer request=new StringBuffer();

    //not thread safe--lets check if it works fine
    StringBuilder request=new StringBuilder();

////NOTE!!!:even with large request lenght no interference was seen  so what is the problem with NOT being thread safe??

    @Override
    public void init(FilterConfig config) throws ServletException {
    //
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {


    //HERE WE PUT SOME CODE REGARDING TO FILTERING REQUESTS
    //HERE WE SHOULD DEFINE A REGEX TO VALIDATE THE STRING IF IT IS NOT THE RIGHT STRING REDIRECT THE REQUEST TO A NEW ADDRESS!!
        //String is immutable so we need to use string buffer or string builder
        //StringBuffer is synchronized, StringBuilder is not. BUT as far as we know Servlet creates new thread for each request fo we
        //need to be synchronised!!

        request.append(req.getParameter("line"));
        System.out.print(request);

      if (request!=null){
          Token.trim(request.toString());
          res.getWriter().print(request);
      }else {
          res.getWriter().print("Error got Null from the client!");
      }

    }

    @Override
    public void destroy() {
    //
    }
}

在这两种情况下我发送一个非常长的请求使用一个表格如下(实际上通过使用这种形式我发送两个非常长的请求输入)但我们得到上述过滤器的输出,我没有看到任何干扰之间输出结果,这意味着这两个运行线程安全并没有破坏StringBuffer或StringBulder,所以剂量意味着线程安全剂量在这种情况下?

<!DOCTYPE html>
<html>
<head>
    <title>a request page</title>
</head>
<body>
<form action="http://localhost:8080/Compute" method="POST">
    Compute it: <input type="text" name="line"><p>
    <input type="submit" value="Compute">
</form>

</body>
</html>

2 个答案:

答案 0 :(得分:0)

由于StringBuffer已同步,因此您未看到输出结果之间存在任何干扰的唯一原因,StringBuilder未同步。请注意,StringBuffer和StringBuilder对象是可变的,这意味着可以更改存储在String对象中的值。

由于StringBuffer已同步,因此使用起来更安全。

答案 1 :(得分:0)

它们都在错误的环境中使用。过滤器不应该保持请求的状态。其他人已经提到的StringBuilder上的操作不是线程安全的。同样,Jon提到StringBuffer上的操作仅对单个操作是安全的,而不是对聚合操作例如安全。您最终可能会在同一append(...)个对象的多个主题中拥有StringBuffer