1. 程式人生 > >項目中遇到的引用傳遞引發的問題

項目中遇到的引用傳遞引發的問題

map all 很難 分享 但是 是我 shm 應該 遇到

最近項目部署在服務器以上出現了一個問題,就是下拉框出現了本來不應該存在在這個下拉框中的分類,領導讓我和另一個實習生一起找原因在哪,下拉框中的內容是程序起來的時候加載到緩存中的,代碼是這樣

技術分享圖片

碼表會被放到一個HashMap裏,大致就是map<1001,<1,"競賽">> 這個意思。當時我全部思維都在考慮是不是加載過程中出現了問題,甚至想到了是不是因為線程不安全,在插入當前鍵的時候,臟讀了。但是覺得又不太可能,當前key裏面多的僅僅是另一個key全部的數據,不會這麽湊巧,確實是沒有想到問題出在哪裏。然後領導給我們倆舉了幾個例子(說實話,一個十幾年的老開發能夠這麽用心的教我們甚至從基礎給我們講真的很難得,我很尊敬的一個人)

技術分享圖片

看見這例子我就有點知道領導是啥意思了,果不其然一看出錯的代碼,恍然大悟。

技術分享圖片

riskType只是1106這個鍵的map對象的一個引用,而putAll進去101000這個key的map的值,實際上還是對緩存中的數據進行的操作,所以一執行這個方法,緩存中1106這個map裏面的值就變成了1106和101000的全部數據了,頁面顯示也就出錯。這裏也就是涉及到了java中引用傳遞和值傳遞的問題,java核心技術中說過,所有的傳遞實際上都是值傳遞,傳遞的都是引用的copy,雖然一個方法執行完畢,創建的這個引用就斷了,但是對這個引用所連接到的對象所做的操作卻是不可逆的,這也是這個問題形成的問題。雖然這段代碼不是我寫的,但是我寫的話也難免會出現這樣的問題,雖然這些基礎我明白,但是思維局限在這,不會想到實際開發中會造成的這種問題,所以寫這篇博客提醒自己,寫代碼的時候一定不要粗心。最後我改完以後這個地方成了這樣

技術分享圖片

有什麽錯誤請大家多多指教。

項目中遇到的引用傳遞引發的問題