无冥冥之志者,无昭昭之明;无惛惛之事者,无赫赫之功。
 解释:没有专心致志地刻苦学习,就没有融会贯通的智慧;没有埋头执着的工作,就不会取得显著的成就。

    Volatile是Java并发编程中比较重要的一个关键字。以下从面试中常遇到的问题了解一下这个关键字。

谈谈对volatile的理解?

  volatile是什么?

    Volatile是Java中用于多线程并发编程的一个关键字。

  volatile的作用?

    用于修饰变量,主要功能有两个:1. 保证线程之间的可见性;2. 禁止指令重排序;

  可见性:

    线程可见是指:被Volatile关键字修饰的变量,当有一个线程对这个变量修改时,其他线程可以立即知道他们的工作内存中这个变量的副本已经过时,再次使用需要从主内存获取。

  禁止指令重排序

    禁止指令重排序有两个含义:1.在程序执行Volatile变量的读操作或者写操作时,在其前面的操作的更改一定已经全部进行,其结果对后面的操作可见;在其后面的操作肯定没有进行。2.在进行指令优化的时候,不能将votable变量访问语句的前面的语句放到volatile变量访问语句的后面,也不能将volatile变量访问语句后面的语句放到volatile变量访问语句的前面。

volatile原理是什么?

    使用volatile修饰的变量,其语句在生成汇编代码的时候加入来一个lock前缀,相当于加入来一个内存屏障。这个内存屏障提供3个功能:1、确保指令重排序时,不会把后面指令排到内存屏障前面的位置,也不会把内存屏障前面的指令排到后面。2、强制将对缓存的修改立即写入到主存。3、如果是写操作,会导致其他CPU对应的缓存行无效。

volatile可以保证原子操作吗?

    Volatile无法保证线程对变量的操作是原子性的。

volatile如何实现禁止指令重排序?

    通过加入内存屏障实现。

双重检验的单例模式实现中,使用volatile修饰单例对象的原因是?

    双重校验实现单例使用volatile主要是使用volatile的禁止指令重排序的功能。因为对象的创建分为三步:1、给对象分配内存;2、初始化成员变量;3、将引用指向内存。如果不使用volatile关键字,有可能第2步和第3步顺序颠倒,使得其他线程获得不完整的对象。



参考: Java并发编程:volatile关键字解析

results matching ""

    No results matching ""