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