|
|
1
6
我认为它是安全的,因为Java内存模型指出:
|
|
|
2
3
这也适用于链式构造函数。 如果必须在构造函数中注册,请将侦听器定义为静态内部类。这是安全的。 |
|
|
3
3
您的第二个版本不正确,因为它允许“this”引用从构造过程中转义。使用“this”转义将使赋予最终字段安全性的初始化安全保证失效。 为了解决这个隐含的问题,构造结束时的障碍只发生在对象构造的最后。一个读者关于内联的直觉是有用的;从Java内存模型的角度来看,方法边界是不存在的。 |
|
|
4
1
编辑 在建议编译器内联私有构造函数的注释之后(我没有想到优化),代码很可能是不安全的。而不安全的多线程代码中最糟糕的部分是它似乎可以工作,所以最好完全避免它。如果你想玩不同的把戏(你确实想因为某种原因避开工厂),考虑添加一个包装器来保证内部实现对象中的数据和外部对象中的注册的一致性。 我猜它会很脆弱但没问题。编译器不知道是否只从其他构造函数中调用内部构造函数,因此必须确保只调用内部构造函数的代码的结果正确,所以不管它使用什么机制(内存屏障?)必须在那里。
我猜编译器会在每个构造函数的末尾添加内存屏障。问题仍然存在:你通过了
解决办法是 脆弱的 在另一天,您或其他程序员可能需要向对象中添加另一个成员,并且可能会忘记链式构造函数是一种并发技巧,并可能决定在公共构造函数中初始化字段,这样做将在yo中添加一个难以检测的潜在数据竞争。你的应用程序,所以我会尽量避免那个构造。 顺便说一句:猜测的安全性可能是错误的。我不知道编译器有多复杂/智能,也不知道它是否可以尝试优化内存障碍(或类似的东西)。由于构造函数是私有的,编译器确实有足够的信息来知道它只是从其他构造函数调用的,并且这足够的信息来确定内部构造函数中不需要同步机制… |
|
|
5
1
在c-tor中转义对象引用可以发布未完全构造的对象。即使是这样 如果发布是构造函数中的最后一个语句 . 即使执行了C-Tor内联(我认为这不是——考虑通过访问私有C-Tor来使用反射创建对象),在并发环境中,您的安全侦听器的行为也可能不正常。 |
|
|
user29759326 · 如何返回递归函数中的最后一个值? 1 年前 |
|
|
malife89 · 将java中的字符串读取为正确的日期格式 1 年前 |
|
|
Tim · 在java中,有没有更快的方法将字节数组写入文件? 1 年前 |
|
|
rudraraj · java中未声明最终变量 1 年前 |
|
|
Bala Ji · 以下BFS的实施效率如何? 1 年前 |