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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怎么解决 数据丢失的问题_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會有什么問題?

-END-

Java一日一條

ID:mjx_java

在看?

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。