最近项目部署在服务器以上出现了一个问题,就是下拉框出现了本来不应该存在在这个下拉框中的分类,领导让我和另一个实习生一起找原因在哪,下拉框中的内容是程序起来的时候加载到缓存中的,代码是这样
码表会被放到一个HashMap里,大致就是map<1001,<1,"竞赛">> 这个意思。当时我全部思维都在考虑是不是加载过程中出现了问题,甚至想到了是不是因为线程不安全,在插入当前键的时候,脏读了。但是觉得又不太可能,当前key里面多的仅仅是另一个key全部的数据,不会这么凑巧,确实是没有想到问题出在哪里。然后领导给我们俩举了几个例子(说实话,一个十几年的老开发能够这么用心的教我们甚至从基础给我们讲真的很难得,我很尊敬的一个人)
看见这例子我就有点知道领导是啥意思了,果不其然一看出错的代码,恍然大悟。
riskType只是1106这个键的map对象的一个引用,而putAll进去101000这个key的map的值,实际上还是对缓存中的数据进行的操作,所以一执行这个方法,缓存中1106这个map里面的值就变成了1106和101000的全部数据了,页面显示也就出错。这里也就是涉及到了java中引用传递和值传递的问题,java核心技术中说过,所有的传递实际上都是值传递,传递的都是引用的copy,虽然一个方法执行完毕,创建的这个引用就断了,但是对这个引用所连接到的对象所做的操作却是不可逆的,这也是这个问题形成的问题。虽然这段代码不是我写的,但是我写的话也难免会出现这样的问题,虽然这些基础我明白,但是思维局限在这,不会想到实际开发中会造成的这种问题,所以写这篇博客提醒自己,写代码的时候一定不要粗心。最后我改完以后这个地方成了这样
有什么错误请大家多多指教。
原文地址:https://www.cnblogs.com/wxw7blog/p/9382327.html