阅读完这篇文章后 - 什么是“synchronized”? 我仍然无法理解为什么在线程安全的环境中StringBuffer会比StringBuilder慢。StringBuffer需要做哪些额外耗时的工作,使其变慢呢?
即使是无争用锁,获取和释放锁也会产生一些小的开销,并且锁消除在StringBuffer
中不起作用,即使大多数实例没有跨线程使用,因为某个实例可能会被跨线程使用。
请参见http://book.javanb.com/java-threads-3rd/jthreads3-CHP-5-SECT-1.html,了解虚拟机在获取和释放锁时所需执行的操作。
确保事物同步运行。更准确地说,是不同步运行。同步方法调用意味着该方法的两个不同调用(如果它不是静态的,则在该对象上)必须轮流进入该方法。只有当线程A(已经在方法中)完成后,线程B才能进入synchMeth方法。
检查是否已锁定同步块以及由谁锁定需要额外时间。
从JavaDoc中阅读此内容:
StringBuilder类提供了与StringBuffer兼容的API,但不保证同步。该类旨在用作StringBuffer的替代品,在单个线程使用字符串缓冲区的地方(通常情况下)使用。如果可能的话,建议优先使用此类而不是StringBuffer,因为在大多数实现中它将更快。
您必须阅读StringBuffer vs. StringBuilder性能比较文章。
自JDK 5发布以来,该类已补充了一个等效类,设计用于单个线程使用:{StringBuilder}。应该优先使用StringBuilder类,因为它支持所有相同的操作,但更快,因为它不执行同步。