本人记忆差,整理这个思维导图,相当于较认真的看了一遍,整个思维导图,基本上就是对原文的拷贝。
有了层级关系。和本人自己的一些理解。由于思维导图弄出来的图片大于100M了。所以就放出源文件,
更方便的阅读查阅。免积分下载:http://download.csdn.net/detail/mr_zhuqiang/8945087 (我很无语啊。以前的确是免积分,不知道啥时候变成5积分了。也不知道怎么修改成0积分)
有几点我觉得是看这个本书或则思维导图。你要明白的是:
1. 什么是内存可见性
2. 在java程序中,在底层执行的代码指令并不是完全按照顺序执行的-有重排序的存在
3. volatile 是一个和硬件的位数、数据的位数相关的概念,实际上和多线程是无关。
例:long:64位,在32位的硬件上操作long需要两次来往(寄存器和内存间),就可以需要volatile(多线程)来保证当前线程完全写入64位,其它线程才能读或写在64位硬件上操作long(64位),用不用volatile一点影响都没有(机器指令已经保证了这一点)
如果这个无误的话,那么就验证了 volatile的两个特性,可见性和原子性。然而,想用代码来展示出错效果的话,貌似写不出来,
有用volatile来保证同步性的。但是这个的确是误用的,volatile只是保证该变量的读写,并不保证 复合操作的同步性。所以应该记住volatile的两个特性就行了
4.正是因为有了重排序和数据竞争才出现了多线程并发安全问题
5.什么是逸出?:对象还没构造完成 引用已经被其他地方使用了 - 称为逸出
6.final的修饰的变量正确的初始化方法
下面是整理的思维导图层级截图展示