我用 Java 1.6 编写了一个 webapp 并在 tomcat 中运行它。虽然我没有做任何显式线程,但我想知道 Spring 和 Tomcat 在幕后发生了什么。我会使用 StringBuilder 而不是 StringBuffer 遇到任何问题吗?
5 回答
如果您使用的是局部变量,则可以安全地使用StringBuilder
. 每个线程都将获得自己的实例。
通常 Java EE 组件在默认情况下不是线程安全的,因此除非您同步使用 . 的代码块,否则您StringBuilder
将遇到竞争条件。因此,您要么必须处理同步,要么使用StringBuffer
.
当然,如前所述,如果StringBuilder
是局部变量,您不必担心。
使用 StringBuilder 因为您的构建器是 doPost 或 doGet 或其他中的局部变量。确实,多个服务器线程使用相同的 servlet 实例,但事实上您的构建器是一个局部变量,没有理由担心!如果您的构建器是您的 servlet 类的成员,那么您肯定会遇到线程安全问题。我猜这不是你的情况。
如果代码在 Servlet (doGet/doPost) 中,那么多个请求将导致 servlet 实例成为多线程。如果代码在 Spring bean 中,则取决于您将 bean 配置为单例还是原型。
Java 文档说关于 java.lang.StringBuffer:
每当发生涉及源序列的操作(例如从源序列追加或插入)时,此类仅在执行操作的字符串缓冲区上同步,而不在源上同步。
这意味着您对 StringBuffer 的操作将是安全的,即使您处于多线程环境 [如 web 应用程序]。StringBuffer 实例的安全性由变量的范围控制。