浅谈java中的 “i=i++;”
首先有一下代码:
public class Demo{ public static void main(String []args){ int i=12; i=i++; System.out.println(i); } }
你可以试想这段代码是多少 大多数同学可能会回答是13,然而事实并非如此,如下图结果:
在上图中,我首先进行了运行,可以看到结果,我们的i并不是如大多人猜测的那样为13输出 ,而是看上去没有做这个自增的操作,然而这是为什么呢?
于是,就有了后面反编译为字节码的操作,我们利用javap 指令反编译后可以看清楚其中发生的事情,有同学对其中的JVM指令不清楚,没关系,我这里先普及一下本文代码中所涉及的JVM指令;
(这里的关键指令码在于main方法之后,因此只针对于下面的指令进行解释,其之前的是虚拟机自动构建的默认构造方法的指令码)
1.bipush: 将单字节的常量值(-128~127)推送至栈顶
2.istore: 将栈顶int型数值存入指定本地变量
3.iload: 将指定的int型本地变量推送至栈顶
4.iinc: 该指令用于对本地(局部)变量进行自增减操作。该指令第一参数为本地变量的编号,第二个参数为自增减的数量
5.getstatic 获取指定类的静态域,并将其值压入栈顶(到这个位置之后就是调用静态对象out打印的操作不再赘述,感兴趣的同学可以在本文末尾附上的链接的去了解一下)
知道基本的几个指令之后我们来分析上图中关键指令的意思吧:
bipush 12这里是把12推至栈顶 栈里存储了12 这个int数值
istore_1 这里是把12弹出给第二个(备注:第1个本地变量应该是this)本地变量 即i=12
iload_1 这里是把第二个本地变量(i)的值推入栈顶 此时栈顶为12
iinc 1,1 自然是i=i+1 即i++ 这个时候i=13
istore_1这里是把栈顶值弹出给本地变量i,这个时候 i又被赋值为 12
因此最终 打印出来的时候i为12。
CSDN一老哥整理的JVM指令集合,很方便查询学习
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77226.html
摘要:在多线程的问题上面概念比较多,也需要慢慢理解,其实也在多线程的锁的上面做了很多优化,还有互斥同步和非互斥同步,还有很多概念,什么是自旋和自适应自旋,锁消除顺便提一下,上面的字符串拼接的例子就是用到了这种优化方式,锁粗化,我们下次再继续分享。 在我们平常的开发工作中,或多或少的都能接触到多线程编程或者一些并发问题,随着操作系统和系统硬件的升级,并发编程被越来越多的运用到我们的开发中,我们...
摘要:并发设计的三大原则原子性原子性对共享变量的操作相对于其他线程是不可干扰的,即其他线程的执行只能在该原子操作完成后或开始前执行。发现两个线程运行结束后的值为。这就是在多线程情况下要求程序执行的顺序按照代码的先后顺序执行的原因之一。 并发设计的三大原则 原子性 原子性:对共享变量的操作相对于其他线程是不可干扰的,即其他线程的执行只能在该原子操作完成后或开始前执行。 通过一个小例子理解 pu...
摘要:主机架构与内存模型多任务处理器在现代计算机系统中几乎已是一项必备的功能了。在计算机系统中,可能存在多个处理器,每个处理器都有自己的高速缓存,而他们又共享同一主内存。 计算机:辅助人脑的好工具 计算机的定义: 接受使用者输入指令与数据, 经由中央处理器的数学与逻辑单元运算处理后,以产生或储存成有用的信息 我们的个人电脑也是计算机的一种,,依外观来看这家伙主要分三部分: 输入单元:包括键...
摘要:由于实现了接口,它支持通过索引值去随机访问元素。第三种,循环遍历。如下效率分析遍历时,使用随机访问即,通过索引序号访问效率最高,而使用迭代器的效率最低类型转换如何实现与基本数据类型的装换将转换为基本的数据类型。 虽是读书笔记,但是如转载请注明出处 http://segmentfault.com/blog/exploring/ .. 拒绝伸手复制党 字符串遍历 String str...
阅读 1184·2021-11-17 09:33
阅读 3578·2021-09-28 09:42
阅读 3240·2021-09-13 10:35
阅读 2393·2021-09-06 15:00
阅读 2396·2021-08-27 13:12
阅读 3591·2021-07-26 23:38
阅读 1759·2019-08-30 15:55
阅读 523·2019-08-30 15:53