java – 想象一个真正的并发场景,其中应该使用StringBuffer而不是StringBuilder?

我知道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());
        }
    }
}

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...