怎么解决 数据丢失的问题_ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案...
特點:
依托于線程的生命周期而存在,貫穿于整個線程,解決了線程前后值傳遞的問題。
一次存入,只要線程不結束都可以獲取到
不具有多線程之間共用數值的特性,只存在于單個線程內,主子線程之間不會出現值傳遞。
(除非進行特殊的代碼操作),但是多線程對象卻共同存在于
ThreadLocalMap的Entry中,這也是多線程處理并發的一種能力ThreadLocal被ThreadLocalMap中的entry的key弱引用,如果出現GC的情況時,沒有被其他對象引用,會被回收,但是ThreadLocal對應的value卻不會回收,容易造成內存泄漏,這也間接導致了內存溢出以及數據假丟失。
在前面的總結中我為啥說數據會假丟失呢,大家可以看如下代碼:
Entry中的key在GC的時候會被回收,但是對應的Value卻還存在,這樣就會造成key(null)的情況,對應的value也會取不到,這就是內存泄漏的原因。
同時也會造成數據丟失。。如下圖中的代碼:
執行如圖代碼:
結果為:
留坑必須要填:既然發現問題,就要解決問題
如果我們要使用ThreadLocal的作為線程前后的數據傳輸,又不想在遇到GC的時候數據被丟失,可以如下操作:
利用餓漢單例模式占用對象,不讓GC對ThreadLocal進行垃圾回收。測試一下:
結果為:
最后,貼一張網絡上對ThreadLocal做的拓撲圖:
虛線代表這弱引用,當前線程保存了ThreadLocalMap作為自己的local屬性,而Map中的key又弱引用了ThreadLocal,從而達到了ThreadLocal不存數據,而數據存在Thread中,而根據ThreadLocal獲取Thread中的值。
ThreadLocal中經典的面試題(根據本文應該有一個比較深的理解了):
ThreadLocal有什么缺陷?
如果是線程池里的線程用ThreadLocal會有什么問題?
Java一日一條
ID:mjx_java
喜歡文章,點個在看?總結
以上是生活随笔為你收集整理的怎么解决 数据丢失的问题_ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flash制作车轮往前滚动的动画效果(w
- 下一篇: 三点弯曲弹性模量怎么计算公式_怎么计算弯