由于StringBuffer
是线程安全的,因此可以安全地发布。考虑StringBuffer
(来源)的公共构造函数:
public StringBuffer() {
super(16);
}
super(16)
指定此位置的位置:
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
值声明为
char[] value;
问题:如何StringBuffer
安全发布?
我有以下课程:
public class Holder{
public final StringBuffer sb = new StringBuffer();
}
可以认为它是安全出版物吗?我认为不可能。
final
保证我们将看到参考的新价值sb
。但是写入sb
内部的的内部状态AbstractStringBuilder(int capacity)
是不同步的。因此,没有happens-before
顺序,这反过来意味着在构造函数中value
调用sb.append(2);
和写入时发生读操作value
是racy。
你能帮忙了解一下吗?也许我错过了什么...
你能帮忙了解一下吗?也许我错过了什么...
AFAIR后JSR-133
可以保证final
是你的榜样初始化喜欢之类的领域是竞争条件免费期间实例化过程,只有正确的值将初始化后,被曝光
更新:通过Brian Goetz
在新的内存模型下,在构造函数中写入final字段与在另一个线程中对该对象的共享引用的初始加载之间存在类似事前发生的关系。构造函数完成后,对final字段(以及通过这些final字段间接可访问的变量)的所有写入均变为“ frozen”,并且保证在冻结后获得对该对象的引用的任何线程都可以查看所有冻结值。冰冻的田野。与构造函数关联的冻结之后,初始化final字段的写入操作将不会按操作进行重新排序。
恕我直言,您的问题(和并发理解)非常好,因为它不是明显的语言/平台设计功能,并且仅在Java SE 5.0中得到了解决。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句