Servlet 的 doFilter 方法中的 StringBuffer 或 StringBuilder? [复制]

Posted

技术标签:

【中文标题】Servlet 的 doFilter 方法中的 StringBuffer 或 StringBuilder? [复制]【英文标题】:StringBuffer or StringBuilder in Servlet's doFilter method? [duplicate] 【发布时间】:2013-07-29 08:41:13 【问题描述】:

我正在实现我的自定义过滤器:

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 就足够了吗?

【问题讨论】:

***.com/questions/12961254/… 正如 Javadoc 所建议的,如果可以,您应该始终使用 StringBuilder。注意:StringBuffer 仅在您只对其执行一项操作时才是线程安全的,对于多个操作来说它不是线程安全的,因此恕我直言,它毫无用处。 这根本不像是重复的——这是指过滤器中StringBuffer的含义,而不是两者之间的实际区别. 【参考方案1】:

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

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

推荐阅读:

    Why are local variables thread safe in Java。 StringBuilder and StringBuffer in Java servlet-filters tag wiki

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

StringBuilder 被设计为不带synchronizationStringBuffer直接替换

只需使用StringBuilder,除非您真的想在线程之间共享缓冲区。 StringBuilder 是原始同步 StringBuffer 类的非同步关系。

在您的情况下,StringBuilder 非常有意义。即使在其他情况下,请考虑同步方法然后使用StringBuffer

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于Servlet 的 doFilter 方法中的 StringBuffer 或 StringBuilder? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

AEM 中 doFilter servlet 的调度程序白名单

在 doFilter 中设置后获取 Cookie

doFilter() 是在 Servlet 的工作完成之前还是之后执行?

Servlet过滤器重定向:如何在chain.doFilter(request,resp)之后重定向;

Servlet——Filter过滤器

servlet中filter和chain有啥用?