只需一篇文章吃透 Java 多线程技术,内容非常全面
volatile 相关经典面试题
谈谈 volatile 的特性
volatile 的内存语义
说说并发编程的 3 大特性
什么是内存可见性,什么是指令重排序?
volatile 是如何解决 java 并发中可见性的问题
volatile 如何防止指令重排
volatile 可以解决原子性嘛?为什么?
volatile 底层的实现机制
volatile 和 synchronized 的区别?
谈谈 volatile 的特性
volatile 的内存语义
当写一个 volatile 变量时,JMM 会把该线程对应的本地内存中的共享变量值刷新到主内存。
当读一个 volatile 变量时,JMM 会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。
说说并发编程的 3 大特性
原子性
可见性
有序性
什么是内存可见性,什么是指令重排序?
可见性就是指当一个线程修改了共享变量的值时,其他线程能够立即得知这个修改。
指令重排是指 JVM 在编译 Java 代码的时候,或者 CPU 在执行 JVM 字节码的时候,对现有的指令顺序进行重新排序。
volatile 是如何解决 java 并发中可见性的问题
底层是通过内存屏障实现的哦,volatile 能保证修饰的变量后,可以立即同步回主内存,每次使用前立即先从主内存刷新最新的值。
volatile 如何防止指令重排
也是内存屏障哦,跟面试官讲下 Java 内存的保守策略:
在每个 volatile 写操作的前面插入一个 StoreStore 屏障。
在每个 volatile 写操作的后面插入一个 StoreLoad 屏障。
在每个 volatile 读操作的前面插入一个 LoadLoad 屏障。
在每个 volatile 读操作的后面插入一个 LoadStore 屏障。
结尾
这不止是一份面试清单,更是一种”被期望的责任“,因为有无数个待面试者,希望从这篇文章中,找出通往期望公司的”钥匙“,所以上面每道选题都是结合我自身的经验于千万个面试题中经过艰辛的两周,一个题一个题筛选出来再次对好答案和格式做出来的,面试的答案也是再三斟酌,深怕误人子弟是小,影响他人仕途才是大过,也希望您能把这篇文章分享给更多的朋友,让他帮助更多的人,帮助他人,快乐自己,最后,感谢您的阅读。
由于细节内容实在太多啦,在这里我花了两周的时间把这些答案整理成一份文档了,在这里只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
评论