i++为什么不是原子操作

写一个简单的例子:

我们直接看编译后的java字节码

发现 i++ 对应的 java 字节码 为innc 1,1(已经圈出来),这是什么意思呢,意思是把变量1的值增加1,这里变量1就是i。

还发现,为什么代码号是从0开始,3结束,是不是发现少了两行?没错,就是少了两行,iinc 命令其实是三步,占了三行(单独占一行的为原子操作),也就是i++其实执行了三步。

继续深入探讨,这三步是哪三步呢?

1、读内存到寄存器;2、在寄存器中自增;3、写回内存。

内存就像是一个笔记本,我们只能读或者写,不能进行运算,我们只能用大脑思考后,在往笔记本上写。

同样的,对计算机来说内存只能读或者写,加法运算只能通过cpu来实现,下面来类比说明:

  1. 计算机将内存中的变量值读入cpu的寄存器--------(人看到-笔记本上的i 的值 ,把这个值写入 大脑的临时记忆区)
  2. cpu 对其 + 1运算并运算后的值放入寄存器-------- (大脑对 这个 值进行加一运算,把这个值写入大脑的临时记忆区)
  3. 把这个值写入内存--------(把这个值写到笔记本上)

这里也类比说明了为什么cpu的1级缓存读写的时候比从内存中读快。

若继续深入探讨,这三步究竟做了设呢么事情,那就需要学习硬件知识了,这里不做深究,有兴趣的同学问度娘。(再细研究,比如第一步计算机怎样将内存中的变量值读入cpu的寄存器,就如同研究大脑怎么看到笔记本上的图像把他转化为数字,超出了我的知识领域了~)

点击这里查看博主其他博客

猜你喜欢

转载自blog.csdn.net/qq_35425070/article/details/83866209