海南省建设信息官方网站,网站 关键词 选择,Wordpress手帐,2018新网站做外链原创1 背景在学习并发的时候看到了ConcurrentLinkedQueue队列的源码#xff0c;刚开始的时候是看网上的帖子#xff0c;然后就到IDE里边看源码#xff0c;发现offer()方法在1.7版的时候有过修改。楼主的问题不是整个方法#xff0c;而是其中的一截代码“(t ! (t tail))”刚开始的时候是看网上的帖子然后就到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跟同事讲解的时候又分析了 ii 、 ii、i i1的字节码发现 i 使用的是iinc的命令而ii1使用的是iadd指令。