知道这些,面试时volatile就稳了

在Java相关的岗位面试中,不少面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字做为一个小的切入点,每每能够一问到底,把Java内存模型(JMM),Java并发编程的一些特性都牵扯出来,深刻地话还能够考察JVM底层实现以及操做系统的相关知识。
本文以一次假想的面试过程,来深刻了解下volitile关键字
题目有标题党的嫌疑,可是若是你们好好理解文中涉及到的两篇文章,相信你对volatile有更深入的认识!

【灵魂拷问开始】

面试官:Java并发这块了解的怎么样?说说你对volatile关键字的理解?
面试官:能不能详细说下什么是内存可见性,什么又是重排序呢?
面试官:volatile怎么保证可见性的?多个线程之间的可见性,你能讲一下底层原理是怎么实现的吗?
面试官:volatile关键字是怎么保证有序性的?
面试官:volatile能保证可见性和有序性,可是能保证原子性吗?为何?
面试官:了解过JMM内存模型吗?简单的讲讲
到这里,个人眼里已经是常含泪水了。不是由于我对代码爱的深沉,而是由于我菜的真诚!面试

没事,不就是个破volatile吗?别念了,我学习还不行吗!编程

Q1:请你谈谈对volatile关键字的理解?

volatile是JVM提供的轻量级的同步机制缓存

1.保证可见性
2.保证有序性,禁止指令重排
3.不保证原子性(须要借助synchronized或者CAS)并发

小伙子,不错么😊,回答对了 1 + 1,得来点 2 + 2 的难度了app

Q2:什么是内存可见性,volatile怎么保证多个线程之间的可见性的?

问题2和问题3讲到的可见性,用JMM来解释的话,本质上是同一个问题。至于有序性和重排序,到问题4再讨论。学习

一问到内存的可见性,volatile相关的,直接就把JMM内存模型搬出来好吧。先放图,而后再表演。spa

如下是俺我的的回答,有不足或漏洞,欢迎你们更正指出!操作系统

所谓可见性,是指当一条线程修改了共享变量的值,新值对于其余线程来讲是能够当即得知的

每一个线程都有本身独立的工做区间,为了匹配CPU的运行速度,他们不会直接从内存中读取数据,而是将数据拷贝一份到CPU缓存中(即每一个线程本身的工做内存),他们之间的相互交互,是经过内存来完成的。线程

根据JMM内存模型的8大原子操做,每一个线程在j将数据操做完stroe回主存以前,会加lock指令来锁定内存区域的缓存(缓存行锁定),根据MESI缓存一致性协议,总线经过侦听器发现数据被修改,会当即让其余线程工做内存中不一致的副本当即失效。3d

等到当前线程将更改后的数据write回主存后,当即执行unlock指令。

此时,其余线程再从新读取更新后的数据,再拷贝到本身的工做内存。总线侦听机制会在总线上检测线程的数据,发现有线程作了更改时准备store回主内存时,它就会马上将其余线程工做内存中的副本置位无效,而后重新到主存获取更新后的值。

除了使用 volatile 关键字来保证内存可见性以外,使用synchronized或Lock锁也能保证变量的内存可见性。只是相比而言使用 volatile关键字开销更小,是轻量级的锁。

这就是内存可见性的原理。

Q3:volatile关键字是怎么保证有序性的?

使用volatile关键字修饰共享变量即可以禁止指令重排序。若用volatile修饰共享变量,在JVM底层volatile是采用“内存屏障”来实现禁止特定类型的处理器重排序。加入volatile关键字时,会多出一个lock前缀指令,lock前缀指令实际上至关于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:

1.它确保指令重排序时不会把其后面的指令排到内存屏障以前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操做已经所有完成;

2.它会强制将对缓存的修改操做当即写入主存;

3.若是是写操做,它会致使其余CPU中对应的缓存行无效。

JMM具有一些先天的有序性,经过Happens-Before原则就能够保证的必定的有序性。

Q4:volatile能保证可见性和有序性,可是能保证原子性吗?为何?

volatile关键字不能保证原子性。

a. 当写一个volatile变量时,JMM会把该线程本地内存中的变量强制刷新到主内存中去;

b. 这个写会操做会致使其余线程中的缓存无效。

对于相似i++这样的复合操做,要想保证原子性,只能借助于synchronized、Lock以及并发包下的AtomicInteger的原子操做类。AtomicInteger对基本数据类型的 自增(加1操做),自减(减1操做)、以及加法操做(加一个数),减法操做(减一个数)进行了封装,保证这些操做是原子性操做。

Q5:了解过JMM内存模型吗?简单的讲讲

看着这张图,直接就巴拉巴拉一顿操做!

相关文章
相关标签/搜索