当前位置:  开发笔记 > 编程语言 > 正文

Java StringBuilder和线程安全

如何解决《JavaStringBuilder和线程安全》经验,为你挑选了3个好方法。

我正在从多个部分构建一个字符串,并希望使用其中任何一个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.从文档中,我无法确定这是否算作多线程的使用.



1> Michael Myer..:

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



2> Kip..:

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

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

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



3> TofuBeer..:

您拥有的代码是安全的.

这段代码不是.

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

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

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有