首页 > 编程语言 > 详细

Java常量赋值失败?

时间:2020-04-19 22:09:32      阅读:55      评论:0      收藏:0      [点我收藏+]

起源

最近在调试一个项目的时候发现一个很古怪的问题。现象如下:
定义一个常量类:

public final class Constants {
    public static final long LIMIT = 6L;
}

然后另一个类中会引用LIMIT这个常量。
然后当我将LIMIT=6L -> LIMIT = 3L时,重新启动springboot项目时,发现引用LIMIT的类中,LIMIT的值还是6,并没有更新成3。
咦???
这个是怎么回事??怎么会没更新呢?
这个不科学啊,后来我尝试把LIMIT修改为实例变量,然后问题消失。
后来我简单Google下,发现网上有遇到同样问题。在我阅读的那篇文章中,作者提出一个调用类的常量池的概念。

在编译期就存到了调用类中,那么如果编译的时候和运行的时候A类发生了变化,常量的值变了,在调用类没有重新编译的情况下,调用类就会引用到一个错误常量值。

后来打开idea编译后的.class文件,发现调用类引用的常量的确没更新,由此引用了错误的常量值。对于这种情况,需要重新编译调用类。

对于这种问题,由于JVM优化导致的,遇见着实令人恶心。。。
以后遇到这种莫名其妙的bug,可以朝着这个思路排查一下。

参考文献





Java常量赋值失败?

原文:https://www.cnblogs.com/aibilim/p/4ea38156417b3d474497dbada2c991a7.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!