volatile关键字(2019尚硅谷大厂面试题_周阳老师讲解笔记)

1.并发和并行的区别:
并发:多个线程同时访问一个资源,例如秒杀场景
并行:是一边干啥 一边干啥,比如一边听音乐,一边看小说

2.请谈谈你对volatile的理解:
volatile是Java虚拟机提供的轻量级的同步机制,三大特性:
保证可见性,不保证原子性,禁止指令重排

JVM(java虚拟机)
由高并发引出-----JMM(java内存模型),本身就是一种抽象的概念,但是并不真实存在,它描述的是一组规则或规范,通过这组规范定义了线程中各个变量的访问方式。JMM关于同步的规定:1)线程解锁前,必须把变量的最新值刷新到主内存 2)线程加锁后,必须读取主内存最新值保存到自己的内存 3)加锁解锁必须是同一把锁

可见性是由JMM(java内存模型定义的),具体定义:
可见性 就是 一个线程改变了主物理内存中的值,其他线程能立马收到通知

3.JMM(java内存模型) 是大多数多线程开发需要遵守的规范
可见性
原子性
有序性
volatile关键字(2019尚硅谷大厂面试题_周阳老师讲解笔记)_第1张图片

4.代码验证volatile的可见性
volatile关键字(2019尚硅谷大厂面试题_周阳老师讲解笔记)_第2张图片

volatile关键字(2019尚硅谷大厂面试题_周阳老师讲解笔记)_第3张图片

5.volatile的不保证原子性
原子性的定义:
不可分割,完整性,也即某个线程正在做某个具体业务不可被加塞或者分割,需要整体完整。要么同时成功,要么同时失败。保证数据的完整一致性。
volatile的不保证原子性,运用反证的方法,假设有20个线程,每个线程执行1000次number++,理论number最终结果为20000,但是我们发现用volatile修饰的变量最终值不等于20000,以此证明volatile不具备原子性。

6.volatile的不保证原子性原理
为什么volatile不能保证原子性?
volatile关键字(2019尚硅谷大厂面试题_周阳老师讲解笔记)_第4张图片

7.如何解决volatile的不保证原子性
方案一:synchronized (不建议使用)
方案二:使用atomicInteger(atomic原子性,天生就保证原子性)
volatile关键字(2019尚硅谷大厂面试题_周阳老师讲解笔记)_第5张图片

注意:不只是atomicInteger,这个是保证原子性的Integer类型,还有其他保证原子性的类型
volatile关键字(2019尚硅谷大厂面试题_周阳老师讲解笔记)_第6张图片

8.volatile的禁止指令重排
计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排。
处理器在进行重排指令的时必须考虑指令之间的数据依赖性。
volatile关键字(2019尚硅谷大厂面试题_周阳老师讲解笔记)_第7张图片

在多线程的情况下,计算机在执行程序时,为了提高性能,可能先执行1234,2134,1324 ,不一定从上往下执行。
volatile实现禁止指令重排优化,从而避免多线程环境下程序出现乱序执行的现象

你可能感兴趣的:(volatile关键字,java,volatile)