繁体   English   中英

Java StringBuilder和线程安全

[英]Java StringBuilder and Thread Safety

我正在构建一个多个部分的String,并希望使用StringBufferStringBuilder来实现。 从Java 5文档中,我看到尽可能使用StringBuilder ,但需要注意

StringBuilder实例不适合多线程使用。

从这个声明中,我理解我不应该有多个线程共享的单个StringBuilder实例。 但是这个案子呢:

//Is this safe?
//foo() is called simultaneously by multiple threads
String foo(String a, String b) {
    return new StringBuilder(a).append(b).toString();
}

这里函数中可能同时存在多个线程,同时使用StringBuilder类(例如,静态变量的并发访问,如果有的话),但每个线程都有自己独立的StringBuilder实例。 从文档中,我无法确定这是否算作多线程的使用。

那很好。 局部变量在线程安全性方面没有问题,只要它们不访问或改变实例或类变量即可。

是的,这是安全的,因为StringBuilder对象仅在本地使用(每个调用foo()的线程将生成自己的StringBuilder)。

您还应该注意,您发布的代码几乎与此生成的字节代码相同:

String foo(String a, String b) {
    return a + b;
}

您拥有的代码是安全的。

这段代码不是。

public class Foo
{
    // safe
    private final static StringBuilder builder;

    public static void foo()
    {
        // safe
        builder = new StringBuilder();
    }

    public static void foo(final String a)
    {
        // unsafe
        builder.append(a);
    }

    public synchronized void bar(final String a)
    {
        // safe
        builder.append(a);
    }
}

仅使用本地数据的局部变量没有线程安全问题。 一旦开始处理在类或实例方法/变量级别可见的数据,您就只能遇到线程安全问题。

同意其他答案 - 只是一个注释。

如果有多个线程正在使用StringBuffer的情况,那么它可能是一个完全破坏的用例,因为它意味着单个字符串是以准随机顺序构建的,所以制作StringBuffer线程没有意义安全。

我不确定是否需要此代码,因为Java我会自动选择StringBuilder。 如果您没有性能问题,请使用+ b。

如果有性能需求,请尝试:

return new StringBuilder(
a.length() + b.length()).append(a).append(b).toString();

它正确调整缓冲区的大小,并防止VM调整大小并创建垃圾以便在途中收集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM