3

阅读本文后- “同步”是什么意思?我仍然无法理解为什么 StringBuffer 在线程安全环境中会比 StringBuilder 慢。StringBuffer 必须做哪些额外的耗时工作才能使其变慢?

4

3 回答 3

7

即使是非竞争锁,也有一些小的开销获取和释放,即使大多数实例没有跨线程使用,省略也不起作用,因为实例可能是这样。StringBuffer

请参阅http://book.javanb.com/java-threads-3rd/jthreads3-CHP-5-SECT-1.html了解 VM 在获取和释放锁时必须执行的操作。

于 2011-06-09T14:07:27.240 回答
2

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

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

于 2011-06-09T14:08:55.763 回答
2

JavaDoc中阅读

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

您必须阅读这篇关于StringBuffer 与 StringBuilder 性能比较的文章

从 JDK 5 开始,这个类已经补充了一个为单线程使用而设计的等效类,{StringBuilder}。通常应优先使用 StringBuilder 类,因为它支持所有相同的操作,但速度更快,因为它不执行同步。

附加有用链接:StringBuffer 和 StringBuilder 类之间的区别。

于 2011-06-09T14:13:38.197 回答