我想理解为什么声明为final的引用不能声明为Volatile。在SO上也有类似的问题[ 为什么Java中的Object成员变量不能同时为final和volatile?
[1]:为什么Java中的Object成员变量不能既是final也不是volatile?但我不确定该答案是否能理解FINAL。
现在,最终变量的状态可以在初始化后确定地更改。只有引用不能初始化为另一个对象。
例如考虑以下成员变量
final StringBuilder sb = new StringBuilder("CAT");
现在另一个线程将sb更改为:
sb.append("S");
如果此变量为Non-Volatile,此更改是否可用于Java内存模型中的不同线程?
编辑:我将StringBuffer更改为StringBuilder,以使某些人明白我的观点。
如果此变量为Non-Volatile,此更改是否可用于Java内存模型中的不同线程
是的,但这是因为StringBuffer是线程安全的-意味着它在内部提供锁定,这将导致内存障碍,因此其他线程可以查看此更新。
可变的引用不会影响对象的操作,而是会影响引用。
所以你可以做
volatile StringBuilder b = new StringBuilder();
b = someOtherStringBuilder;
现在,由于b是volatile,其他线程将看到此引用的更新。
但是做
b.append("foo");
不能保证其他线程会看到对现有b
对象的更改。与StringBuffer不同,StringBuilder不是线程安全的,因此无论如何都不要提供自己的锁定,否则不要这样做。
如果您想保证b.append("foo");
在不进行任何锁定的情况下对其他线程可见,那么StringBuilder中的每个成员字段也需要是可变的。(尽管这不能使其线程安全)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句