为什么StringBuffer方法比StringBuilder方法慢? StringBuffer是同步的(或线程安全的),而StringBuilder则不是。这使得StringBuffer方法的执行速度变慢。

3
阅读完这篇文章后 - 什么是“synchronized”? 我仍然无法理解为什么在线程安全的环境中StringBuffer会比StringBuilder慢。StringBuffer需要做哪些额外耗时的工作,使其变慢呢?

2
你回答了自己的问题。StringBuffer是同步的,因此它必须做更多的工作,而另一个则不必如此。在这种情况下更糟糕的是,99%的时间它都是不需要的。 - Peter Lawrey
1
...他链接的线程基本上解释了为什么同步比没有同步的代码要花费更多。 - Kaj
由于之前问题的焦点不在于同步方法需要执行什么额外的工作,我必须假设可能还有比答案中提到的更多工作(为了证明我遇到的“除非需要同步,否则不要使用StringBuffer”这种极端主张)。下面所选的答案给出了我所需的信息。我认为这个问题是合理的。 - Shailesh Tainwala
3个回答

7

2

确保事物同步运行。更准确地说,是不同步运行。同步方法调用意味着该方法的两个不同调用(如果它不是静态的,则在该对象上)必须轮流进入该方法。只有当线程A(已经在方法中)完成后,线程B才能进入synchMeth方法。

检查是否已锁定同步块以及由谁锁定需要额外时间。


2

JavaDoc中阅读此内容:

StringBuilder类提供了与StringBuffer兼容的API,但不保证同步。该类旨在用作StringBuffer的替代品,在单个线程使用字符串缓冲区的地方(通常情况下)使用。如果可能的话,建议优先使用此类而不是StringBuffer,因为在大多数实现中它将更快。

您必须阅读StringBuffer vs. StringBuilder性能比较文章。

自JDK 5发布以来,该类已补充了一个等效类,设计用于单个线程使用:{StringBuilder}。应该优先使用StringBuilder类,因为它支持所有相同的操作,但更快,因为它不执行同步。

其他有用的链接:StringBuffer和StringBuilder类之间的区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接