提问者:小点点

如何安全地发布StringBuffer?


public StringBuffer() {
    super(16);
}
AbstractStringBuilder(int capacity) {
    value = new char[capacity];
}
char[] value;
public class Holder{
     public final StringBuffer sb = new StringBuffer();
}

final保证我们将看到引用sb的新值。但是在AbstractStringBuilder(int Capactory)内写入SB的内部状态是不同步的。因此,没有happens-before顺序,这反过来意味着在调用sb.append(2)时发生了从value读取;和在构造函数中写入value是不合理的。

你能帮我理解一下吗?也许我错过了什么...


共1个答案

匿名用户

你能帮我理解一下吗?也许我错过了什么...

AFAIR在JSR-133之后,可以保证像您的示例中那样初始化的类的final字段在实例化过程中没有争用条件,并且在init之后只公开正确的值

UPD:通过布莱恩·戈茨