final 的语义

来源:互联网 发布:dnf驱魔技能改版数据 编辑:程序博客网 时间:2024/06/06 09:47
public class FinalFieldExample {final int x;int y;static FinalFieldExample f;public FinalFieldExample() {x = 3;y = 4;}static void writer() {f = new FinalFieldExample();}static void reader() {if (f != null) {int i = f.x;int j = f.y;}}}

上面的代码中

1、线程A 执行 reader() 时,保证可以看到 f.x 就是 3,因为 x 是 final 的

2、线程A 执行 reader() 时,不能保证可以看到 f.y 就是 4,因为 y 不是 final 的


public FinalFieldExample() { // bad!  x = 3;  y = 4;  // bad construction - allowing this to escape  global.obj = this;}

线程A 读到 global.obj,这时,线程A 不能保证 看到 f.x 就是 3


可以看到 final field 的正确构建的值,这种能力确实不错,但是,如果 field 本身是一个引用,你也想要你代码看到此引用指向对象(或数组)的最新值。如果你的 field 是final的,这也是可以保证的。所以,如果你有一个指向数组的 final 引用,那么你就不用担心“其他线程看到了数组引用的正确值,但却看到了此数组内容的错误值”。再次强调,这里的“正确”,我们指的是“此值新到 end of the object's constructor,而不是指最最最最新的值

线程A 正确构建了 immutable 对象 im 后,你想要保证 线程B 可以正确的看到 im,此时,你依然需要使用 synchronized。因为 没有任何其他方式可以保证 “指向 immutable 对象的 引用 就可以神奇的被第二个线程所看到”(指向 非immutable 对象的 引用,不能神奇的被第二个线程所看到。同样,指向 immutable 对象的 引用,也没啥神奇之处的)

final fields 究竟提供了什么呢,哈哈,答案即将揭晓,这就是:(好吧,我没看懂这里是啥意思,我就只把英文列在这里吧)
The guarantees the program gets from final fields should be carefully tempered with a deep and careful understanding of how concurrency is managed in your code

我估摸着是这个意思:

首选要 深入、仔细的了解 在你的代码中并发是如何管理的,然后才能 仔细的推敲出 final fields 带给程序的究竟是何种保证

原创粉丝点击