【问题标题】:Should I use StringBuilder or StringBuffer for webapps?我应该为 webapps 使用 StringBuilder 还是 StringBuffer?
【发布时间】:2012-08-19 09:54:28
【问题描述】:

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

【问题讨论】:

  • @thinksteep 这个问题的重点是在 webapps 的幕后发生了什么样的线程以及它如何影响字符串的构建。
  • 可能不是重复的。这似乎更像是一个关于 Tomcat 中的线程的问题,而不是 StringBuilder/StringBuffer 类本身。

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


【解决方案1】:

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

【讨论】:

  • +1。如果您正在在线程之间共享字符串(例如通过使用静态字段),那么您可能应该使用String 而不是StringBuilder StringBuffer
  • 强调 ruakh 的观点:在线程之间传递不可变数据是安全的方法。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 更准确地说,您应该说:servlet 实例可能由服务于不同客户端的多个线程共享。
      • 这是一个更好的说法。 :)
      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-05
        • 1970-01-01
        • 1970-01-01
        • 2017-05-27
        • 2014-05-27
        • 2016-12-17
        • 1970-01-01
        • 2011-02-27
        相关资源
        最近更新 更多