微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/java/126595.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐