这篇文章是我对volatile关键字的整理,为了方便之后复习查看。
如果面试官问我volatile,我先概括并发编程的三个问题:
- 原子性 操作系统保证一个指令集合的执行是原子性(套娃),即要不都执行,要不不执行。保证执行过程不会被中断或者调度。
- 可见性 是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
- 有序性 指令重排的问题,就是操作系统为了优化,就可能不保证执行顺序像你源代码写的那样一行行来。
并发编程中的三个问题
对于这三个概念的说明和举例大家都是一模一样,可以参见这篇文章:Java并发编程:volatile关键字
好多内容都是那篇文章看的。
内存的相关概念
首先知道cpu中一块区域叫做高速缓存,为了缓解内存和cpu速度差异过大的问题。cpu执行程序时,优先从高速缓存中查找有没有对应的缓存变量。如果是多线程执行,在多核系统下, 这个程序中的一个共享变量可能会被拷贝多份在不同的高速缓存中,当其中一个线程对其改变值时,写回的时候只会暂时停留在高速缓存这个层面,而不是内存,所以就引发一个问题,一个线程修改后,其他线程还是用的老的那个值,这就是缓存不一致的问题。