1. 程式人生 > 其它 >Java基礎回顧:ThreadLocal

Java基礎回顧:ThreadLocal

1. 是什麼 是一個數據結構,有點像HashMap,可以儲存"key : value"鍵值對,但是一個ThreadLocal只能儲存一個,並且各個執行緒的資料互不干擾。 作用:在多執行緒環境下,如何防止自己的變數被其它執行緒篡改 2. 如何實現執行緒隔離
  • 每個執行緒中維護一個ThreadLocalMap資料結構,當執行set方法時,其值是儲存在當前執行緒的threadLocals變數中,當執行get方法中,是從當前執行緒的threadLocals(ThreadLocal.ThreadLocalMap類)變數獲取。
  • 所以線上程1中set的值,對執行緒2來說是接觸不到的,而線上程2中重新set的話,也不會影響到執行緒1中的值,保證了執行緒之間不會互相干擾。
3. ThreadLocalMap 類HashMap的資料結構,但是並沒有實現Map的介面。 在ThreadLocalMap中,也是初始化一個大小為16的Entry陣列,Entry物件用來儲存每一個key-value鍵值對,只不過這裡的key永遠都是ThreadLocal物件。Entry中不存在連結串列。 hash衝突?找下一個空位置 4. 為什麼會導致記憶體洩漏,如何避免? 當使用ThreadLocal儲存一個value時,會在ThreadLocalMap中的陣列插入一個Entry物件,在ThreadLocalMap的實現中,Entry的key是ThreadLocal物件的弱引用。ThreadLocal在沒有外部強引用時,發生GC時會被回收,如果建立ThreadLocal的執行緒一直持續執行,那麼這個Entry物件中的value就有可能一直得不到回收,發生記憶體洩漏。 如何避免:1. 顯示的呼叫remove方法 注:記憶體洩漏
:記憶體申請後,用完沒有釋放,造成可用記憶體越來越少,即無法釋放已申請的記憶體。 5. 主要應用場景 資料庫管理類 session管理
// 阿里巴巴 java 開發手冊中推薦的 ThreadLocal 的用法:
import java.text.DateFormat;
import java.text.SimpleDateFormat;
 
public class DateUtils {
    public static final ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>(){
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        }
    };
}
// 然後我們再要用到 DateFormat 物件的地方,這樣呼叫
// DateUtils.df.get().format(new Date());
多執行緒測試 一點浩然氣,千里快哉風!