“StringBuffer是同步的(或线程安全的)而StringBuilder不是”,为什么这会使StringBuffer方法变慢?

时间:2011-06-09 13:59:35

标签: java synchronization thread-safety stringbuilder stringbuffer

阅读完之后 - What does 'synchronized' mean?我仍然无法理解为什么在线程安全的环境中StringBuffer比StringBuilder慢。 StringBuffer必须做多少耗时的工作才能让它变慢?

3 个答案:

答案 0 :(得分:7)

即使是非竞争锁也会有一些小的开销获取和释放,StringBuffer在{{1}}中不起作用,即使大多数实例都不是跨线程使用的,因为实例可能是。

有关获取和释放锁定时VM必须执行的操作的说明,请参阅lock elision

答案 1 :(得分:2)

确保事情同步运行。或者,更重要的是,不同步。同步方法调用意味着该方法的两种不同调用(如果该对象不是静态的话)必须轮流进入该方法。线程B无法进入方法synchMeth,直到线程A(已经在方法中)完成。

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

答案 2 :(得分:2)

JavaDoc

阅读
  

StringBuilder类提供了一个API   兼容StringBuffer,但有   不保证同步。这个   class被设计用作drop-in   替换StringBuffer的地方   使用字符串缓冲区的地方   通过单个线程(通常如此)   案子)。在可能的情况下,它是   建议使用此类   对StringBuffer的偏好   在大多数实施中都要快。

您必须阅读StringBuffer vs. StringBuilder performance comparison

上的这篇文章
  

从发布JDK 5开始,这个类有   补充了等价物   专为单人使用而设的课程   thread,{StringBuilder}。该   一般应该是StringBuilder类   优先使用这个,作为   它支持所有相同的操作   但它更快,因为它没有   同步。

其他有用链接:Difference between StringBuffer and StringBuilder class.