java 执行基础运算时内存调度过程

当我们执行i=i+1时;有没有想过i是怎么执行+1操作的,他的过程是什么?
我查过一些资料,虽然不是很深,但还是要分享一下我的理解。

jvm的所有运算操作都是要依赖cpu进行的,当java中执行i=i+1时,首先是jvm将i=i+1操作的过程生成cpu能执行的指令,然后cpu来执行i=1+1的操作。

  1. cpu将i所在的内存中的值读到高速缓存区中。
  2. 然后再从高速缓存区读取i的值到主存中。
  3. 然后cpu执行加运算将主存中i的值加1。
  4. 然后cpu加主存中i修改后的值同步到高速缓存区中。
  5. 最后将高速缓存区的数据刷新到i所在的Java内存中。

执行图解:

这里写图片描述

在多线程下,这些操作可能会照成数据丢失。

例如两个线程同时执行i=i+1;首先同时读i的值到高速缓存区中,然后同时执行i+1操作,假如i的初始值为1,执行i=i+1后,最终两个线程会将i值(即为2)写入到java内存中。这就造成了一个线程的加运算丢失。最终真实结果应为3.

猜你喜欢

转载自blog.csdn.net/CSDNzhangtao5/article/details/66972888
今日推荐