天天看點

ThreadLocal管理Connection

ThreadLocal管理Connection

每一個使用者都對應有一個單獨線程,每一個線程都有一個資料庫連接配接對象Connection對象接待它.

一個使用者對應一個線程,這個線程中的Connection對象或者資料庫連接配接對象是唯一的,且隻能有一個.

怎麼去獲得這個資料庫連接配接對象?(看下面的代碼)

ThreadLocal還可以管理Hibernate中的session對象,還可以管理Struts2中的dispatherFileter和Spring中的東西.

每個線程都有一個獨立的副本,這樣會存在一個小問題.

如果線程特别多,對象特别大的話.這個時候會造成記憶體占用的比較大,記憶體洩露的問題.(這是一個非常嚴重的問題)

ThreadLocal 用于每一個線程都有一個對象的副本。“以空間換時間”

給了解決方案:

源碼中繼承了一個WeakReference類,弱引用.通過這個類解決了可能造成的記憶體洩露的問題.

一般的類,如果不繼承WeakReference這個類,都是強引用的.

強引用比如說: String str = "xxx";  str被xxx引用着,如果引用不消失.

即使這個引用沒有工作了,他們就一直會占用着記憶體.垃圾回收無法把他們回收掉.

如果是弱引用的,即使它飲用着,如果它不工作了...垃圾回收照樣會把它們回收.

這就是ThreadLocal的解決記憶體洩露的問題.

但是仍然建議你使用ThreadLocal類中的remove()方法手動的移除掉.

<col>

作者:SummerChill