Java基础之Volatile原理

java

原文链接: http://www.aoaoyi.com/archives/956.html

计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据 的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就 存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU 执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来 进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。当程序在运行过程 中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可 以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数 据刷新到主存当中。举个简单的例子,比如下面的这段代码:

i = i + 1;

当线程执行这个语句时,会先从主存当中读取 i 的值,然后复制一份到高速缓存当中, 然后 CPU 执行指令对 i 进行加1操作,然后将数据写入高速缓存,最后将高速缓存 中 i 最新的值刷新到主存当中。

这个代码在单线程中运行是没有任何问题的,但是在多线程中运行就会有问题了。在多核 CPU 中,每条线程可能运行于不同的 CPU 中,因此 每个线程运行时有自己的高速缓存(对 单核CPU来说,其实也会出现这种问题,只不过是以线程调度的形式来分别执行的)。比如 同时有两个线程执行这段代码,假如初始时 i 的值为 0 ,那么我们希望两个线程执行完之后i 的值变为2。但是事实会是这样吗?

可能出现这种情况:初始时,两个线程分别读取 i 的值存入各自所在的 CPU 的高速缓存当 中,然后 线程1 进行加1操作,然后把 i 的最新值1写入到内存。此时线程2的高速缓存当 中 i 的值还是0,进行加1操作之后, i 的值为1,然后线程2把i的值写入内存。最终结 果 i 的值是1,而不是2。这就是著名的缓存一致性问题。通常称这种被多个线程访问的变量 为共享变量。

以上是 Java基础之Volatile原理 的全部内容, 来源链接: utcz.com/z/390110.html

回到顶部