我应该在Web应用程序中使用StringBuilder还是StringBuffer?

7

我正在使用Java 1.6编写一个Web应用程序并在Tomcat中运行。虽然我没有使用任何显式线程,但我想知道Spring和Tomcat背后的情况。如果我使用StringBuilder而不是StringBuffer,会遇到任何问题吗?


可能是Java中的StringBuilder和StringBuffer的重复问题。 - kosa
@thinksteep 这个问题应该关注Web应用程序背后发生的线程处理以及它如何影响字符串构建。 - Bob Roberts
4
可能不是重复问题。这似乎更多地涉及Tomcat中的线程问题,而不是StringBuilder/StringBuffer类本身的问题。 - Mike M
5个回答

11

如果您使用本地变量,可以安全地使用StringBuilder。每个线程将获得自己的实例。


4
如果你正在多个线程之间共享字符串(例如通过使用静态字段),那么你应该使用String而不是StringBuilderStringBuffer。请注意,这里并没有改变原文的意思。 - ruakh
4
强调ruakh的观点:在线程之间传递不可变数据是安全的方法。 - Mike M

2
通常情况下,Java EE组件默认情况下不是线程安全的,因此,除非您在使用 StringBuilder 的代码块中同步,否则您将遇到竞态条件。因此,您需要注意同步或使用 StringBuffer
当然,如已经提到的,如果 StringBuilder 是一个局部变量,则无需担心。

1
Java文档关于java.lang.StringBuffer的说明如下:
每当涉及源序列(例如从源序列附加或插入)的操作发生时,此类仅在执行操作的字符串缓冲区上同步,而不是在源上同步。这意味着即使在多线程环境(例如Web应用程序)中,您对StringBuffer的操作也将是安全的。 StringBuffer实例的安全性由变量的范围控制。

1
在doPost或doGet中使用StringBuilder,因为您的构建器是局部变量。虽然多个服务器线程使用同一个servlet实例,但是由于您的构建器是局部变量,所以没有理由担心!如果您的构建器是servlet类的成员,则肯定会出现线程安全问题。我想这不是您的情况。

0

如果代码在Servlet(doGet/doPost)中,则多个请求将导致Servlet实例成为多线程。如果代码在Spring bean中,则取决于您是否将bean配置为单例或原型。


更准确地说,你应该说:servlet 实例可能会被多个线程共享,为不同的客户端提供服务。 - Razvan
那是一个更好的说法。 :) - Mike Barlotta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接