为什么带参数StringBuffer的类String构造函数方法使用同步块,而带StringBuilder的构造函数不使用同步块?
public String(StringBuffer buffer) {
synchronized(buffer) {
this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
}
}
public String(StringBuilder builder) {
this.value = Arrays.copyOf(builder.getValue(), builder.length());
}
StringBuffer
被设计为线程安全的,并在多线程应用程序中使用。
但即使采用了这种设计,在调用buffer.getValue()
和buffer.length()
之间,其他线程仍有可能尝试修改buffer
。这意味着CCD_ 5将反映该修改之前的状态,而CCD_。
通过String构造函数内的synchronized(buffer)
同步缓冲区对象上的两个调用可以防止其他线程访问该buffer
的同步方法。这尤其包括能够修改buffer
的方法,所以在String构造函数处理它的过程中不可能这样做。
因为StringBuilder
与StringBuffer
的区别在于StringBuffer
是线程安全的,而StringBuilder
不是。请注意,线程安全会带来性能损失,因此StringBuffer
只能用于多线程使用。
来自官方文件:
字符串缓冲区对于多个线程使用是安全的。方法是必要时同步,以便特定实例的行为就好像它们以某种串行顺序出现与每个涉及的单个线程。