0. ThreadLocal的使用:在線程外創(chuàng)建ThreadLocal類型的threadLocal變量, threadLocal.set(v) 將threadLocal作為key,v作為value放入在每個線程中創(chuàng)建的ThreadLocalMap中的一個entry里,一個Tread持有一個ThreadLocal.ThreadLocalMap,可以進行多個不同的threadlocal.set()。
1. 對于每個map,例如hashMap,只要原本的key丟失了,value對象就會發(fā)生泄露。但是對于hashMap,回收hashMap即可回收掉里面的table里所有的元素。
2. 在使用線程池時,線程不會被輕易回收,ThreadLocalMap也就不會輕易回收,所以需要一些策略解決內(nèi)存泄露問題。
3. 用戶在threadlocal不使用時,可以調(diào)用remove()來回收對應(yīng)entry中的value。
4. 為了防止用戶不自主回收value,ThreadLocal類采用如下設(shè)計,Entry中的key弱引用持有threadLocal對象,在threadLocal引用為null時,threadLocal對象會被很快回收,也就是Entry中的key會置為null。這樣就知道了哪些value已經(jīng)無效了。
5. 在調(diào)用set(),get(),remove()時,都有相應(yīng)的策略去清理已經(jīng)無效的value。
標(biāo)簽: