我正在从多个部分构建一个字符串,并希望使用其中任何一个StringBuffer
或StringBuilder
这样做.从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); } }
仅使用本地数据的局部变量没有线程安全问题.一旦开始处理在类或实例方法/变量级别可见的数据,您就只能遇到线程安全问题.