很多人在回答新手提问的时候会说,StringBuilder 是非同步的,所以快一些,StringBuffer是同步(线程安全)的,所以慢一些。
从技术上说这句话是没有错的,但是为什么多线程的时候仍然用 StringBuilder,不建议用StringBuffer(StringBuffer 建议永远不要使用)?
简单的说,StringBuffer的“线程安全”在大多数时候增加了大量不必要的成本,并且未必达到目的。
看下面的代码:
StringBuffer buffer = getStringBuffer();
for(int i=0; i<10000; i++) buffer.append(i); // append 方法上由关键字 synchronized ,是同步方法
StringBuffer 的每一步操作都先获取同步锁,然后释放同步锁。
所以这段代码中,它获取了10000次锁,释放了10000次锁。
除了获取、释放10000次锁的高昂成本之外,它真的实现了“线程安全”的目的吗?
假如在这个for循环运行的过程中,有另一个线程对 buffer 做了操作:
buffer.append("some string");
那么这个 "some string"