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 带给程序的究竟是何种保证
- final 的语义
- final的内存语义
- final域的内存语义
- java关键字-final语义
- java多线程学习(九)final的内存语义
- java Final关键字语义剖析
- Java多线程 -- JUC包源码分析3-- volatile/final语义
- Java多线程 -- JUC包源码分析3-- volatile/final语义
- STL的安插语义与覆盖语义
- 语义的需要
- 语义Web的概念
- 语义的需要
- 语义的需要
- 语义的需要
- 语义报表的发布
- 语义的需要
- volatile的单纯语义
- 语义的需要
- 第七周任务2
- android代码重构日记(一)——命名规范
- 哈佛公开课《Positive Pyschology 1504》学习笔记 -- Change
- hdoj 4200 Bad Wiring(贪心)
- experiment: Unicode ini wrapper UTF16_LE BOM Operation
- final 的语义
- 程序员10大境界【走在路上,潜心修行】
- padding(内边距) margin(外边距)使用区别
- WinXP利用无线网卡做AP共享上网
- C/C++ 日期和时间
- Random Thoughts #6 科技改变生活
- const用法
- C#导出Excel总结
- 动态申请一维、二维、三维数组方法