我应该将StringBuilder或StringBuffer用于webapps吗?

时间:2012-08-23 20:05:22

标签: java thread-safety stringbuilder stringbuffer java-6

我在Java 1.6中编写webapp并在tomcat中运行它。虽然我没有做任何明确的线程,但我想知道Spring和Tomcat幕后发生了什么。我会使用StringBuilder而不是StringBuffer遇到任何问题吗?

5 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:2)

默认情况下,Java EE组件通常不是线程安全的,因此除非您同步使用StringBuilder的代码块,否则您将遇到竞争条件。因此,您要么必须处理同步,要么使用StringBuffer

当然,如前所述,如果StringBuilder是一个局部变量,您不必担心。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用StringBuilder,因为构建器是doPost或doGet中的局部变量。确实,多个服务器线程使用相同的servlet实例,但构建器是本地变量的事实,没有理由担心!如果您的构建器是servlet类的成员,请确保您遇到线程安全问题。我想这不是你的情况。

答案 4 :(得分:0)

Java doc说关于java.lang.StringBuffer:

  

每当涉及源序列的操作发生时(例如   附加或插入源序列)此类同步   仅在执行操作的字符串缓冲区上,而不是在源上。

这意味着即使您处于多线程环境[如Web应用程序],您对StringBuffer的操作也是安全的。 StringBuffer实例的安全性受变量范围的控制。