美文网首页
p.casNext诡异问题排查

p.casNext诡异问题排查

作者: Sun_1a09 | 来源:发表于2020-04-17 22:11 被阅读0次

idea debug/run返回不同结果

在ConcurrentLinkedQueue源码调试中发现run/debug这两个问题出现不同结果的问题 。 相当诡异!!!
随后只能将代码抽离出来进行排查。

    public boolean offer(E e) {
        final Node<E> newNode = new Node<E>(e);
        Node<E> t = tail, p = t;
        Node<E> q = p.next;
        if (q == null) {
            if(p.casNext(null,newNode)){
                System.out.println(p.next ==p);  //1
                if (p != t) // hop two nodes at a time//2
                    casTail(t, newNode);  // Failure is OK.
                return true;
            }
        }

发现只要断点打在1处就有问题 p.next =p 为true 然而在点2处正常。
可能有一下问题:

  • toString()调用某个方法
  • IDE debug模式调用了某个方法

验证思路

在可变状态方法中增加调试信息

结果

发现first()被多次调用。为了更好了解调用信息 加上调用信息 代码如下:

       System.out.println("-----------------------------------------------------------------");
       StackTraceElement stack[] = Thread.currentThread().getStackTrace();
       for (int i = 0; i < stack.length; i++) {
           System.out.println(stack[i].getClassName() + " -->" + stack[i].getMethodName()+" " +stack[i].getLineNumber() );
       }
       System.out.println("-----------------------------------------------------------------");

debug时日志打印


java.lang.Thread -->getStackTrace 1559
com.ly.lock.ConcurrentLinkedQueue -->first 188
com.ly.lock.ConcurrentLinkedQueue -->isEmpty 214
com.ly.lock.ConcurrentLinkedQueue -->offer 103
com.ly.lock.ConcurrentLinkedQueue -->main 773



java.lang.Thread -->getStackTrace 1559
com.ly.lock.ConcurrentLinkedQueue -->first 188
com.ly.lock.ConcurrentLinkedQueue -->size 235
com.ly.lock.ConcurrentLinkedQueue -->offer 103
com.ly.lock.ConcurrentLinkedQueue -->main 773



java.lang.Thread -->getStackTrace 1559
com.ly.lock.ConcurrentLinkedQueue -->first 188
com.ly.lock.ConcurrentLinkedQueue -->toArray 374
com.ly.lock.ConcurrentLinkedQueue -->offer 103
com.ly.lock.ConcurrentLinkedQueue -->main 773


结论

结果很清晰 在debug时 IDE会自动调用toArray、size 、isEmpty方法从而调用first()方法 查看first会发现 该方法会重新设置头结点 h.lazySetNext(h); 所以造成debug,RUN模式结果不一致这一诡异情况。

相关文章

  • p.casNext诡异问题排查

    idea debug/run返回不同结果 在ConcurrentLinkedQueue源码调试中发现run/deb...

  • 笔记:一个关于形参的内存回收的问题

    今天踩了一个坑,被测试找到排查问题的过程一脸懵逼,由于问题稍显诡异而且搞出问题的做事方式比较符合我的思维习惯,必须...

  • position:fixed定位问题的解决

    本篇文章介绍了一个在开发中遇到的诡异的问题,排查问题过程颇为艰辛,不过最终结果还是值得的,因为巩固了一些基础知识和...

  • 诡异问题

    在使用了mybatis的工程里面,单独执行类的main 方法,进行jdbc连接时报空指针

  • 问题排查

    一、看到文件写入错误和找不到文件错误,首先要想到是不是没有硬盘空间了。二、注意看日志,如果是Tomcat没有启动成...

  • 问题排查

    2020-01-24 cpu 100% 问题 1.找到最耗cpu的进程执行 ,显示进程运行信息列表键入P (大写p...

  • 问题排查

    原因 出现这个报错,大多数是因为你使用了Android Studio自带的jdk导致 解决方案 使用系统中的jdk...

  • 一种Java动态调试与热修复技术实践

    Java动态问题排查修复工具 问题排查基本思路 问题排查是一个比较体系化的领域,'问题'来源于多种多样,按照我的理...

  • 腾讯云和阿里云tcp三次握手的区别

    前言 近日同事遇到一个诡异的问题,帮忙进行了排查,好家伙不查不知道,一查让我知道了,腾讯云和阿里云TCP三次握手居...

  • 【SpringBoot】连接mysql数据库乱码

    问题排查第一步排查前端到后端问题,检查controller收到的参数是否为乱码第二步排查编译器编码保存问题,检查编...

网友评论

      本文标题:p.casNext诡异问题排查

      本文链接:https://www.haomeiwen.com/subject/vupuvhtx.html