java字节码判断对象应用是否被修改

java字节码判断对象应用是否被修改

原创

1 背景

在学习并发的时候看到了ConcurrentLinkedQueue队列的源码,刚开始的时候是看网上的帖子,然后就到IDE里边看源码,发现offer()方法在1.7版的时候有过修改。



楼主的问题不是整个方法,而是其中的一截代码“(t != (t = tail))”,有点发晕,t是个引用,而修改引用的时候不是都修改吗?怎么还会判断是否相等呢 ?

2 为了解决这个问题,写个测试方法。如下:

publicclassReferTest {

publicstaticvoidmain(String[] args) {

ReferTest a =newReferTest();

booleanb= (a != (a =newReferTest()));

}

}

答案:b= true。

说明 a != a,这个就更晕了。在度娘和谷歌上都查不到什么有用的资料,关键是不好描述,引用不等于引用?

再往下楼主就猜测了,引用的东西一般都和栈有关,就想看看方法的字节码指令。使用javap命令解释了方法的字节码指令。





有用的方法看main方法的指令,楼主没有接触过字节码指令,所以找个指令集学学了一下。在这里解释下指令的意义,在这里记录一下。



注意引用1是在命令8的时候加载的a的值,而引用2是新的引用,为什么出现这种情况,原因是if_acmpeq指令是比较两个栈顶的值是否一样。

所以在"!="号的两端的值需要加载到栈顶,而右边是一个表达式,所以先加载左边的值到栈顶然后再去执行右边的表达式,表达式的结果放入栈顶,这个时候a引用1先加载,而表达式的结果会改变a变量的值,但是不会改变栈顶的值。

所以就出现不一致的情况了。

同理,通过这个方式可以判断对应的引用是否改变了。

ps:跟同事讲解的时候,又分析了 i=i++ 、 i=++i、i= i+1的字节码,发现 i++ 使用的是iinc的命令,而i=i+1使用的是iadd指令。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值