Java StringBuilder 和 Thread Safety

我正在从多个部分中构建一个字符串,并希望使用其中之一或这样做。从Java 5文档中,我看到在可能的情况下这是首选,但需要注意的是StringBufferStringBuilderStringBuilder

的实例对于多个线程使用是不安全的。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();
}

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


答案 1

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


答案 2

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

您还应该注意,您发布的代码实际上与以下生成的字节码相同:

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