最近項目部署在服務器以上出現了一個問題,就是下拉框出現了原本不該該存在在這個下拉框中的分類,領導讓我和另外一個實習生一塊兒找緣由在哪,下拉框中的內容是程序起來的時候加載到緩存中的,代碼是這樣
java
碼錶會被放到一個HashMap裏,大體就是map<1001,<1,"競賽">> 這個意思。當時我所有思惟都在考慮是否是加載過程當中出現了問題,甚至想到了是否是由於線程不安全,在插入當前鍵的時候,髒讀了。可是以爲又不太可能,當前key裏面多的僅僅是另外一個key所有的數據,不會這麼湊巧,確實是沒有想到問題出在哪裏。而後領導給咱們倆舉了幾個例子(說實話,一個十幾年的老開發可以這麼用心的教咱們甚至從基礎給咱們講真的很可貴,我很尊敬的一我的)緩存
看見這例子我就有點知道領導是啥意思了,果不其然一看出錯的代碼,恍然大悟。安全
riskType只是1106這個鍵的map對象的一個引用,而putAll進去101000這個key的map的值,實際上仍是對緩存中的數據進行的操做,因此一執行這個方法,緩存中1106這個map裏面的值就變成了1106和101000的所有數據了,頁面顯示也就出錯。這裏也就是涉及到了java中引用傳遞和值傳遞的問題,java核心技術中說過,全部的傳遞實際上都是值傳遞,傳遞的都是引用的copy,雖然一個方法執行完畢,建立的這個引用就斷了,可是對這個引用所鏈接到的對象所作的操做倒是不可逆的,這也是這個問題造成的問題。雖然這段代碼不是我寫的,可是我寫的話也不免會出現這樣的問題,雖然這些基礎我明白,可是思惟侷限在這,不會想到實際開發中會形成的這種問題,因此寫這篇博客提醒本身,寫代碼的時候必定不要粗心。最後我改完之後這個地方成了這樣服務器
有什麼錯誤請你們多多指教。spa