为什么我的对象被 IntelliJ IDEA 悄悄修改了?

背景

    最近,在复习JUC的时候调试了一把ConcurrentLinkedQueue的offer方法,意外的发现Idea在debug模式下竟然会 “自动修改” 已经创建的Java对象,当时觉得这个现象很是奇怪,现在把问题的原因以及解决过程记录下来,希望你在调试的时候不要踩坑。

调试代码

    调试的代码很简单,就是多次调用offer方法,然后观察ConcurrentLinkedQueue的headtail属性。

import java.lang.reflect.Field;
import java.util.concurrent.ConcurrentLinkedQueue;public class ConcurrentLinkedQueueTest {public static void main(String[] args) {ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();print(queue);queue.offer("aaa");print(queue);queue.offer("bbb");print(queue);queue.offer("ccc");print(queue);}/*** 打印并发队列head属性的identityHashCode* @param queue*/private static void print(ConcurrentLinkedQueue queue) {Field field = null;boolean isAccessible = false;try {field = ConcurrentLinkedQueue.class.getDeclaredField("head");isAccessible = field.isAccessible();if (!isAccessible) {field.setAccessible(true);}System.out.println("head: " + System.identityHashCode(field.get(queue)));} catch (Exception e) {e.printStackTrace();} finally {field.setAccessible(isAccessible);}}
}

调试过程

    上述代码在Idea中debug模式下head属性会无缘无故的被修改(run模式下正常,debug模式下关闭所有断点也正常),检查ConcurrentLinkedQueue的源码发现,head属性只有在构造器和反序列化的readObject共3处地方才会被直接赋值(不是cas修改),我也仔细检查了offer方法,确实没有修改head的地方。而Idea在debug时,把head属性修改为第一次offer的Node节点,这个现象就很奇怪了。

  • 在run模式下的输出结果,多次调用offer方法,head属性都是同一个对象(debug模式下关闭所有断点也是同样的效果)
    631355-20190427214601211-248515275.png

  • 在offer方法中断点,然后debug并单步调试(Step over)
    631355-20190427215410065-205556538.png

  • 在offer方法中断点,然后debug并直接运行到下一个断点(Resume program)
    631355-20190427215449861-1463261224.png

    由上可见,在debug进入offer方法之后head属性确实被修改了(对象已经不是同一个),而且这不是偶尔出现,而是一直可以复现的,Step over和Resume program也表现出了修改head属性不同的时机,这让人很费解。 更费解的是就算不在offer方法体里断点,在main方法中断点也会出现head被修改的现象。

  • 转战到Eclipse,同样的环境,同样的操作,在run和debug模式下都不会出现head被修改的情况
    631355-20190427221353433-1352527588.png

分析

    了解到Idea在debug模式下默认开启了toString预览特性(Settings>>Build,Execution,Deployment>>Debugger>>Data Views>>Java>>Enable 'toString()' object view),可是调用toString方法也不至于把对象本身都修改了啊,也专门看了下ConcurrentLinkedQueue的内部类Node,并没有复写toString方法(事后回顾,当时在这里疏忽了,下文会再介绍),但还是关掉特性再测试一遍,然而还是同样的结果,head属性任然被悄悄的修改了。第二天来到公司在同事的环境(IntelliJ IDEA 2019.1)上验证了下,还是同样的问题,排除Idea版本的因素。

    郁闷了一会儿,就向"网友"提问了链接,不久就得到了IntelliJ IDEA的产品经理yole的回复,他的意思还是Idea 的 Data Views 的 toString 在作怪,上文已经说过关掉toString特性还是有这个问题,但是他给了我一个重要的思路就是:在debug模式下,ConcurrentLinkedQueue的对象也会被调用toString方法的,在队列的toString方法中会获取队列的迭代器,而创建迭代器时会调用first方法,first方法里就会cas修改head属性。(之前确实没考虑到队列本身的toString方法,而是去看Node是否重写了toString,手动哭脸?)
    这里需要注意的是,尽管关掉toString特性上面问题还是存在,原因就在于ConcurrentLinkedQueue是一个Collection,Data Views 还有一个选项“Enable alternative view for Collections classes” (平时没注意...)所以也会在debug时造成队列迭代器的遍历。把这个特性也一并关掉,则上面的问题就不会再出现了。
631355-20190429141045413-173558177.png

总结

    之前看到有网友在调试低版本的fastjson的反序列化时也遇到过Idea toString的问题,虽然这可能不会影响程序的正常执行,但是作为开发人员,在debug时完全可能会遇到这种被Idea挖坑的情况。对于Data views特性我目前也持保留态度,如果不是特别依赖就直接关掉吧。

参考:
https://blog.csdn.net/dajiangqingzhou/article/details/78676459
https://www.cnblogs.com/oldtrafford/p/8612089.html

转载于:https://www.cnblogs.com/ocean234/p/10779784.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python加密程序_Python加密程序

展开全部alpabcdefghijklmnopqrstuvwxyz0123456789 def num2alp(c):a alp[c]return(a)def alp2num(d):if d ! :return((ord(d)-97)%37)else:return 36def envVigenere(key,plaintext):m len(plaintext)n len(key)etext ""for i in range(m):p plaintext[i]k k…

如何判断网通、电信、铁通IP地址分配段

从http://ftp.apnic.net/apnic/dbase/tools/ 获取地址 shell> wget http://ftp.apnic.net/apnic/dbase/tools/ripe-dbase-client-v3.tar.gz shell> tar xzvf ripe-dbase-client-v3.tar.gz shell> cd whois-3.1 shell> ./configure shell> make 完成上述编译安…

​std::multimap

2019独角兽企业重金招聘Python工程师标准>>> std::multimap multimap,是一个关联性容器,用于存放这样的元素,这些元素是由键以及关联的值组成.容器内容将根据元素的键进行排序.并且容器可以插入多个具有相同键的元素.接口 pair<const_iterator,const_iterator>…

python调用msfconsole全自动永恒之蓝攻击_MSF之MS17-010永恒之蓝漏洞利用

Loading...请注意&#xff0c;本文编写于 392 天前&#xff0c;最后修改于 116 天前&#xff0c;其中某些信息可能已经过时。# MSF之MS17-010永恒之蓝漏洞利用1. 准备阶段2. 扫描漏洞3. 漏洞攻击---## 准备阶段**实验准备环境&#xff1a;**攻击机&#xff1a;虚拟机kali系统IP…

容器部署解决方案Docker

一、Docker简介 1.1 虚拟化 【什么是虚拟化】 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&…

BREW做的第一个程序--Hello world!

这几天开始做BREW开发了&#xff0c;刚开始挺晕的。又是C指针&#xff0c;又是BREW的SDK文档&#xff0c;还有环境配置&#xff0c;一大堆东东&#xff0c;真是让人手忙脚乱。好不容易配好了环境&#xff0c;写出了第一个Hello world!程序。感觉还不错&#xff0c;就把代码和想…

careercup-链表 2.1

2.1 编写代码&#xff0c;移除未排序链表中的重复节点。 不使用临时缓存&#xff1a; 如果不允许使用临时的缓存(即不能使用额外的存储空间)&#xff0c;那需要两个指针&#xff0c; 当第一个指针指向某个元素时&#xff0c;第二个指针把该元素后面与它相同的元素删除&#xff…

随机排列_“按字母顺序排列”其实是种随机顺序

闲话之前有聊过&#xff0c;微信公众号这边接的广告不多&#xff0c;主要收益来自于微信自带的中插广告。后来同学们还开玩笑说“研究半天没发现这个图片哪里没品了&#xff0c;才发现是广告。”另外还有一部分收益&#xff0c;来自于各位的打赏。鉴于大部分人都是打赏一两块钱…

Python之IO模式 阻塞式io 非阻塞io 多路复用io 异步io 信号驱动io

参考:https://www.cnblogs.com/alex3714/articles/5248247.html 提高:http://www.cnblogs.com/alex3714/articles/5876749.html selectors模块 https://www.cnblogs.com/alex3714/articles/5248247.html转载于:https://www.cnblogs.com/Samuel-Leung/p/10805012.html

日本印象

转自&#xff1a;http://hi.baidu.com/tttt182在日本工作生活三年了&#xff0c;跟大家谈谈我对日本和日本人的亲身感受。第一次在天涯发贴&#xff0c;随便写写&#xff0c;可能会有一些乱&#xff0c;请大家见谅。 1、日本人的个子。的确比较矮。在很多公共场合里挂的镜子&am…

android 获取应用的资源id和uri

2019独角兽企业重金招聘Python工程师标准>>> 在某些应用中&#xff0c;为了实现应用apk资源放入重复利用&#xff0c;或者使用反射得到本应用的资源&#xff0c;需要使用反射反射方式获得&#xff0c;但Resources类中也自带了这种获取方式&#xff0c;并且功能更加强…

Android OOM的解决方式

版权声明&#xff1a;本文为博主原创文章。转载请注明出处。 https://blog.csdn.net/Main_Stage/article/details/26150189 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图&#xff0c;由于这些函数在完毕decode后&#xff0c;终于…

python中的成员运算符_在Python中使用成员运算符的示例

下表列出了所有python语言支持的成员运算符。例如&#xff1a;试试下面的例子就明白了所有的python编程语言提供会员运算符&#xff1a;#!/usr/bin/pythona 10b 20list [1, 2, 3, 4, 5 ];if ( a in list ):print "line 1 - a is available in the given list"else…

(SQL语句)按指定时间段分组统计

我现在有一张表&#xff1a; 列名1 时间 03174190188 2009-11-01 07:17:39.217 015224486575 2009-11-01 08:01:17.153 013593006926 2009-11-12 08:04:46.560 013599584239 2009-11-22 08:53:27.763 013911693526 2009-11-23 08:53:51.683 013846472440 2009…

如何查看Exchange2010中邮箱数据库的用户邮箱占用情况

在EMS界面&#xff0c;用以下命令可以看到数据库的使用情况&#xff0c;并将文件放在指定文件显示&#xff1a; Get-Mailbox -database DBNAME|Get-Mailboxstatistics |sort totalitemsize -desc |ft displayname,totalitemsize,itemcount > D:\report\DBNAME.csv 转载于:ht…

数据库迁移_数据库迁移了解一下

mongodb数据迁移因服务器到期&#xff0c;需要将之前机器上面的数据进行数据迁移&#xff0c;并将服务全部docker化备份首先需要将现有即将到期的服务器上面的mongo数据进行备份mongodump -h dbhost -d dbname -o dbdirectory-h&#xff1a;mongodb所在服务器地址&#xff0c;可…

extern “C”总结

学了就忘&#xff0c;忘了再学。有时感觉自己几乎就是一个跳梁小丑。没有办法&#xff0c;只好多记些笔记。本文版权归作者和博客园共有FROM&#xff1a; http://www.cnblogs.com/graphics/archive/2010/12/24/1916343.html经常看到如下代码&#xff1a;#ifdef _cplusplusexter…

人脸颜值评分软件_在线算个颜值,特科学的那种 | 知多少

用 AI&#xff0c;科学的为颜值打个分。用 AI&#xff0c;打造科学颜值打分器https://www.zhihu.com/video/1185672892095848448图文版本送给不方便打开的朋友 (●u●)」如何科学的为颜值打个分&#xff1f;三庭五眼、四高三低&#xff1f;脸部是否对称&#xff1f;是否与本民族…

图片翻转

图片翻转 原文:图片翻转本人录制技术视频地址&#xff1a;https://edu.csdn.net/lecturer/1899 欢迎观看。这一节继续为大家介绍CSS3的动画效果: 图片翻转。 在iOS中的章节中&#xff0c;我也介绍过类似的效果&#xff0c;如果感兴趣的话&#xff0c;请点击这里查看&#xff1a…

【原】页面跳转以及表单提交中有中文的解决办法

这两天一直碰到一个郁闷的问题&#xff0c;在对表单进行提交的时候&#xff0c;用户名是中文的&#xff0c;怎么测试都不通过, 今天上午突然想起来是不是因为中文字符编码的问题!经过测试&#xff0c;果然是因为这个问题&#xff01; 现在把解决方法贴出来&#xff01;呵呵&…