Java多線程環境下慎用成員變數

最近小編在工作中遇到一個奇怪的問題,經過多方面排查終於找出了罪魁禍首的原因。小編先在這裡賣個關子。下面通過代碼給大家分享下這個問題。

請看下面這段代碼:

主程序運行類

測試main函數

運行結果

一切都很正常,沒有問題啊?為了讓這個問題更容易重現出來,小編作了一下改動:

再來看運行的結果:

現在就出問題了,那麼為什麼會出現這樣的問題呢?下面小編從運行內存方面分析下這個問題:

程序運行的內存圖

那麼怎麼解決這個問題呢,其實很簡單,就是將成員變數換成局部變數就可以解決此類問題。

將成員變數改成用局部變數

這樣不管怎樣運行,結果都是正確的。

修改後的運行結果

那麼為什麼改成局部變數就可以解決此類問題呢,因為java運行時,為方法的每個局部變數分配的內存是存在棧中,當方法執行完后,為該方法分配的局部變數內存也會被垃圾回收回收。

Advertisements

小編遇到這種問題也是排查了很久才找出來了,因為剛開始的時候那種成員變數的值是從資料庫裡面讀取出來的,資料庫的記錄只有一條,所以不會出現什麼問題。後來資料庫加了很多條記錄,然後就出問題了。對於這種問題,小編建議大家在多線程的環境下對於那種經常改變的變數值,還是不要用成員變數,最好全部都改成局部變數。

不知大家在實際開發中有沒有遇到過什麼奇葩的問題,歡迎大家多多分享。

最後小編在這裡祝大家狗年吉祥,生活如意,工作順心,謝謝大家

Advertisements

你可能會喜歡