关于java:Servlet的doFilter方法中的StringBuffer或StringBuilder?

StringBuffer or StringBuilder in Servlet's doFilter method?

本问题已经有最佳答案,请猛点这里访问。

我正在实现我的自定义筛选器:

1
public class MyFilter implements javax.servlet.Filter

我应该在这个doFilter方法中使用哪一个?stringbuffer或stringbuilder?

我想用这种方式:

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

或者…

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

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


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

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

建议阅读:

  • 为什么局部变量在Java中是线程安全的。
  • Java中的StringBuilder和StrugBuffic
  • servlet过滤器标记wiki

  • 因为它是一个局部变量,而不是由线程共享,所以可以使用StringBuilder。


    StringBuilder设计为不带synchronizationStringBuffer的替代品。

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

    在你的例子中,StringBuilder是完全合理的。即使在其他情况下,也要考虑同步方法,然后使用StringBuffer


    StringBuilder是一个更好的选择,因为它具有非同步特性,速度更快。每个请求的servletfilter-dofilter都在自己的线程中运行,因此您不需要同步的数据结构。如果它只是一个局部变量,那么StringBuilder就是选择。


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

    当然,除非该方法中有多个线程同时对其进行修改:)