Servlet的doFilter方法中的StringBuffer或StringBuilder?

时间:2013-07-29 13:58:58

标签: java

我正在实施自定义过滤器:

public class MyFilter implements javax.servlet.Filter

我应该在这个doFilter方法中使用哪个 - StringBuffer或StringBuilder?

我想以这种方式使用它:

StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(MY_CODE_HERE);
response.sendRedirect(stringBuffer.toString());

或......

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(MY_CODE_HERE);
response.sendRedirect(stringBuilder.toString());

我知道StringBuffer是线程安全的,但StringBuilder是否足够?

5 个答案:

答案 0 :(得分:9)

局部变量是线程安全的,在doFilter()方法中声明的变量将是线程安全的。使用StringBuilder表示您的目的,因为您不应该不必要地承担StringBuffer中使用的同步开销。

此外,Servlet请求和响应对象是为每个新请求和响应重新创建的,因此它们本质上是线程安全的。 doFilter()方法将在每个请求的单独线程中执行。

建议阅读:

  1. Why are local variables thread safe in Java
  2. StringBuilder and StringBuffer in Java
  3. servlet-filters tag wiki

答案 1 :(得分:3)

由于它是局部变量而不是线程共享,因此可以使用StringBuilder。

答案 2 :(得分:1)

StringBuilder是一个更好的选择,因为它的非同步特性更快。 ServletFilter doFilter用于在其自己的线程中运行的每个请求,因此您不需要同步的数据结构。如果它只是一个局部变量,那么可以选择StringBuilder。

答案 3 :(得分:1)

StringBuilder被设计为StringBuffer的{​​{1}}的插入式替换

除非您真的尝试在线程之间共享缓冲区,否则只需使用synchronizationStringBuilder是原始同步StringBuffer类的未同步相对。

在你的情况下,StringBuilder非常有意义。即使在其他情况下,也可以考虑使用StringBuilder

同步方法

答案 4 :(得分:0)

只要它在方法doFilter()中,它的thread-saferequest scoped。因此,StringBuilder是显而易见的选择。

当然,除非在该方法中产生多个线程并同时修改它:)