阅读完之后 - What does 'synchronized' mean?我仍然无法理解为什么在线程安全的环境中StringBuffer比StringBuilder慢。 StringBuffer必须做多少耗时的工作才能让它变慢?
答案 0 :(得分:7)
即使是非竞争锁也会有一些小的开销获取和释放,StringBuffer
在{{1}}中不起作用,即使大多数实例都不是跨线程使用的,因为实例可能是。
有关获取和释放锁定时VM必须执行的操作的说明,请参阅lock elision。
答案 1 :(得分:2)
确保事情同步运行。或者,更重要的是,不同步。同步方法调用意味着该方法的两种不同调用(如果该对象不是静态的话)必须轮流进入该方法。线程B无法进入方法synchMeth,直到线程A(已经在方法中)完成。
检查同步块是否已被锁定,以及由谁来锁定,需要额外的时间。
答案 2 :(得分:2)
StringBuilder类提供了一个API 兼容StringBuffer,但有 不保证同步。这个 class被设计用作drop-in 替换StringBuffer的地方 使用字符串缓冲区的地方 通过单个线程(通常如此) 案子)。在可能的情况下,它是 建议使用此类 对StringBuffer的偏好 在大多数实施中都要快。
您必须阅读StringBuffer vs. StringBuilder performance comparison
上的这篇文章从发布JDK 5开始,这个类有 补充了等价物 专为单人使用而设的课程 thread,{StringBuilder}。该 一般应该是StringBuilder类 优先使用这个,作为 它支持所有相同的操作 但它更快,因为它没有 同步。
其他有用链接:Difference between StringBuffer and StringBuilder class.