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
被设计为不带synchronization
的StringBuffer
的直接替换。
只需使用StringBuilder
,除非您真的想在线程之间共享缓冲区。 StringBuilder
是原始同步 StringBuffer 类的非同步关系。
在您的情况下,StringBuilder
非常有意义。即使在其他情况下,请考虑同步方法然后使用StringBuffer
【讨论】:
【参考方案5】:只要在doFilter()方法中,它的thread-safe
和request scoped
。所以,StringBuilder
是显而易见的选择。
当然,除非在该方法中产生多个线程同时修改它:)
【讨论】:
以上是关于Servlet 的 doFilter 方法中的 StringBuffer 或 StringBuilder? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
AEM 中 doFilter servlet 的调度程序白名单
doFilter() 是在 Servlet 的工作完成之前还是之后执行?