【问题标题】:When a method is synchronized, can we use StringBuilder over StringBuffer?当一个方法被同步时,我们可以使用StringBuilder而不是StringBuffer吗?
【发布时间】:2014-06-18 17:43:25
【问题描述】:

我有一个同步的方法。我想使用字符串缓冲区来形成一个长连接字符串。我知道 StringBuffer 和 StringBuilder 都可以完成这项工作。同时,我认为 StringBuilder 更好,因为它不会产生任何额外的同步成本,因为该方法已经这样做了。

你说什么?

【问题讨论】:

  • 贴出方法;我怀疑即使没有同步也可以。
  • 如果你的StringBuilder是方法的局部变量,即使方法本身不同步也没关系。
  • 是的,我同意局部变量不会出现并发问题,除非发生了无法预先预测的非常微妙的事情。
  • StringBuilder 也更好,因为您有显式同步。假设您不必担心线程安全,则很容易误用 StringBuffer。 vanillajava.blogspot.co.uk/2013/04/…

标签: java concurrency synchronization stringbuilder stringbuffer


【解决方案1】:

如果您从自己的角度管理线程安全,那么StringBuilder 是不错的选择,而在后一种情况下StringBuffer 会更好。

自己管理线程安全总是更好,因为有时你的代码中有非常小的关键部分,所以method level Synchronization 不是必需的,只有block level 就足够了,但在像StringBuffer 这样的方法中有时同步会导致高昂的成本,但无论如何这取决于您的需要。

【讨论】:

    【解决方案2】:

    只要多个线程不访问StringBuilder 本身或导致以并发方式访问它,那么您应该没问题。

    在您的情况下,如果StringBuilder/Buffer 所在的方法是synchronized,那么任何时候都应该只有一个线程可以访问它,所以StringBuilder 就足够了。

    【讨论】:

      【解决方案3】:

      由于您的 StringBuilder 对象不与其他线程共享,您可以使用它..

      【讨论】:

        猜你喜欢
        • 2011-09-11
        • 1970-01-01
        • 2016-12-17
        • 2018-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-01
        相关资源
        最近更新 更多