![](/img/trans.png)
[英]Why does StringBuffer allows StringBuffer as argument to its constructor even when StringBuffer doesn't have a StringBuffer constructor?
[英]Why does class String constructor method with parameter StringBuffer use synchronize block while the constructor with StringBuilder doesn't?
为什么带有参数 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());
}
因为StringBuilder
与StringBuffer
的区别在于StringBuffer
是线程安全的,而StringBuilder
不是。 请注意,线程安全会带来性能损失,因此StringBuffer
应仅用于多线程使用。
从官方文档:
字符串缓冲区可供多个线程安全使用。 这些方法在必要时被同步,以便任何特定实例上的所有操作表现得好像它们以某种串行顺序发生,该顺序与所涉及的每个单独线程进行的方法调用的顺序一致。
StringBuffer
被设计为线程安全的并在多线程应用程序中使用。
但即使采用这种设计,在调用buffer.getValue()
和buffer.length()
之间仍有可能其他线程尝试修改buffer
。 这意味着getValue()
将反映该修改之前的状态,但该修改之后的length()
状态。
通过 String 构造函数内的synchronized(buffer)
对缓冲区对象的两个调用可防止其他线程访问该buffer
同步方法。 这尤其包括能够修改buffer
方法,因此在 String 构造函数处理它的过程中不可能这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.