加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:09:54 所属栏目:Java 来源:网络整理
导读:我知道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的java
我知道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());
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读