我知道StringBuffer和StringBuilder之间的区别.
read here!
通常,正如javadoc所说,
Where possible,it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.
但是,StringBuilder的javadoc也说:
Instances of
StringBuilder
are not safe for use by multiple threads. If such synchronization is required then it is recommended that {@link java.lang.StringBuffer} be used
所以,我想知道,StringBuffer首选的情况真的存在吗?由于可变字符串主要用于单个线程,任何人都可以给我一个并发的现实场景,首选StringBuffer吗?
解决方法
StringBuffer是线程安全的原因是,在设计java api的第一个版本的那天,人们以不同于现在的方式接近并发.流行的观点是对象应该是线程安全的 – 因为Java支持线程,人们可能在多个线程中使用任何JDK类.后来,当Java开始针对执行时间进行优化时,那些不必要的同步块的成本开始成为一个问题,因此新的API被设计为不同步.更久以后,JVM开始优化锁定,以至于无争议的锁定基本上是免费的,这使整个决策变得没有实际意义.
StringBuffer仍然是线程安全的,因为旧代码可能依赖于它是线程安全的.这远非典型用途,但可以想象.
例如,假设您正在编写一个日志文件追加器,它将日志条目转发到中央服务器.由于我们不想在等待网络I / O时阻塞调用者,因此我们在专用线程中执行此操作.其他线程会在StringBuffer中累积其日志条目:
class RemoteLogger implements Runnable,Appender { final StringBuffer buffer = new StringBuffer(); void append(String s) { buffer.append(s); } public void run() { for (;;) { Thread.sleep(100); String message = buffer.toString(); sendToServer(message); buffer.delete(0,message.length()); } } }