6

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

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

4

5 回答 5

9

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

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

推荐阅读:

  1. 为什么局部变量在 Java 中是线程安全的
  2. Java中的StringBuilder和StringBuffer
  3. servlet 过滤器标签 wiki
于 2013-07-29T14:00:52.560 回答
3

由于它将是一个局部变量并且不被线程共享,因此可以使用 StringBuilder。

于 2013-07-29T14:00:48.487 回答
1

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

于 2013-07-29T14:01:43.937 回答
1

StringBuilder被设计为没有StringBuffer.synchronization

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

在你的情况下StringBuilder,这很有意义。即使在其他情况下,考虑同步方法然后使用StringBuffer

于 2013-07-29T14:11:13.013 回答
0

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

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

于 2013-07-29T14:02:47.900 回答