原创

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指令。

java判断有没有修改,java字节码判断对象应用是否被修改相关推荐

  1. java探针之修改类字节码文件

    java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能.像skywalking和arthas都使用到了这个技术. 具体原理为: jdk1.5以后引入了javaAgen ...

  2. 第 1 章 一 JVM 和 Java 体系架构 (虚拟机介绍、字节码、Java跨平台性)

    第 1 章 JVM 和 Java 体系架构 1.JVM 前言 作为Java工程师, 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却 ...

  3. Java 基础巩固:内部类的字节码学习和实战使用场景

    文章出自:安卓进阶学习指南 主要贡献者: Cloud9527 Alex_赵 Struggle shixinzhang 读完本文你将了解: 背景介绍 四种内部类介绍 成员内部类 静态内部类 局部内部类 ...

  4. Java指令全集_Java的JVM字节码指令集详解

    本文详细介绍了如何使用javap查看java方法中的字节码.以及各种字节码的含义,并且配以完善的案例,一步步,从头到尾带领大家翻译javap的输出.在文末还附有JVM字节码指令集表. 本文不适合没有J ...

  5. java编译后生成字节码_请问java源文件编译后怎么生成字节码文件?

    比如,有的java源程序生成一个字节码文件,带有内部类的生成两个.可是有一种情况怎么回事呢?importjava.awt.*;importjavax.swing.*;importjava.awt.ev ...

  6. 大多数程序员都懂的java虚拟机:C1编译器从字节码到HIR

    从字节码到HIR 正如之前看到的,C1的HIR是一个基于静态单赋值的图IR,由基本块构成控制流图,由静态单赋值指令构成基本块,如图8-1所示. 所有的指令都派生自Instruction类,其中,Blo ...

  7. java 字节码对象_通过java字节码分析学习对象初始化顺序

    mockery.checking(new Expectations() { { one(new Object()).toString(); will(returnValue("") ...

  8. 使用JBE修改.class字节码文件

    1.场景 在excel导出页面数据的时候,发现最多只能导出5000条,但是客户方要求至少得导出66500条吧,本以为问题很简单,我并且还找到了那个类,直接一改,就行了:但是当我测试得时候发现,改动没有 ...

  9. 反射_获取字节码Class对象的三种方式

    * 获取Class对象的方式: 1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象     * 多用于配置文件,将类名定义在配置文件中.读取 ...

最新文章

  1. JavaEE 6 将包括 JSR330 和 JSR299
  2. 信阳哪些技校有学计算机的,2018年信阳十大技校排名 排名前十的学校有哪些
  3. idea html 错误提示,Idea 代码编辑错误不飘红提示
  4. 微软职位内部推荐-Senior Software Engineer_HPC
  5. [代码]--GridControl使用技巧总结,更新中...
  6. Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知(转)...
  7. flex右对齐_移动WEB开发 — Flex布局
  8. 简单几步配置gitlab
  9. 屏幕分辨率修改工具SwitchResX for Mac
  10. 【虹科科普】信号发生器分类及任意波形发生器原理
  11. 锁定计算机后 360wifi,如何使360wifi关闭电脑后继续使?
  12. 【BZOJ 3993】【SDOI 2015】星际战争
  13. 算术右移与逻辑右移的区别
  14. S4 HANA MRP LIVE
  15. java int16_、uint16_、int32_、uint32_ 数据
  16. 驱动器开发:开源库汇总
  17. DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录 专题
  18. Clickhouse求时间差
  19. 明天回家,总结一下,提前拜个早年
  20. 细细品味hadoop

热门文章

  1. 详解异构计算FPGA基础知识
  2. GitHub 被爆开始实名制,以便于执行美国贸易制裁;特斯拉推出超大储能产品Megapack;高通宣布与腾讯游戏达成战略合作……...
  3. Gartner:PaaS 和平台架构领域的 4 大趋势 | 技术头条
  4. 圣诞抽奖 | 2018年的开发者,经历了裁员、加班种种不堪,2019年的你如何获得升职加薪的机会?...
  5. shell安装mysql5.7_一键部署----shell脚本安装MySQL5.7
  6. dev用不了_跟风喊AMD YES?很多生产力项目,你必须用IU
  7. java 黑窗运行_javaday1 如何使用黑窗口打出helloworld并且要学会使用和环境配置/eclipse...
  8. Elasticsearch7.15.2 基础概念和基础语法
  9. SpringBoot2 集成 xxl-job任务调度中心_参数传递
  10. 使用wsimport将wsdl生成java