日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

怎么解决 数据丢失的问题_ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案...

發(fā)布時(shí)間:2023/12/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怎么解决 数据丢失的问题_ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

特點(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)題?

-END-

Java一日一條

ID:mjx_java

點(diǎn)個(gè)在看?

總結(jié)

以上是生活随笔為你收集整理的怎么解决 数据丢失的问题_ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。