7

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

4

5 回答 5

11

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

于 2012-08-23T20:08:14.593 回答
2

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

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

于 2012-08-23T20:11:21.447 回答
1

使用 StringBuilder 因为您的构建器是 doPost 或 doGet 或其他中的局部变量。确实,多个服务器线程使用相同的 servlet 实例,但事实上您的构建器是一个局部变量,没有理由担心!如果您的构建器是您的 servlet 类的成员,那么您肯定会遇到线程安全问题。我猜这不是你的情况。

于 2013-11-14T15:59:08.393 回答
0

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

于 2012-08-23T20:10:50.540 回答
0

Java 文档说关于 java.lang.StringBuffer:

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

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

于 2015-07-16T12:31:05.437 回答