[英]Java StringBuilder and Thread Safety
我正在构建一个多个部分的String,并希望使用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);
}
}
仅使用本地数据的局部变量没有线程安全问题。 一旦开始处理在类或实例方法/变量级别可见的数据,您就只能遇到线程安全问题。
同意其他答案 - 只是一个注释。
如果有多个线程正在使用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.