ThreadLocal一篇將從底層到原理講清

ThreadLocal

1.是什麼

一個存儲結構,可以定義一個變量,每一個線程都可以擁有這個變量的副本,每個線程對於這個變量的修改,都只在本線程內有效,讓共享變量不會出現多線程問題

img

2.內部結構

底層由一個Entry數組構成,key的類型爲弱引用,(弱引用,只能生存到下一次gc前,由次可能發生內存泄漏問題),value爲set傳入的值。不同的線程會有不同的threadmap,而key的值爲當前threadlocal,一個線程有多個threadlocal時,就會根據不同的threadlocal對象的hash值確定不同的數組座標。

static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }
ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
            table = new Entry[INITIAL_CAPACITY];
            int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
            table[i] = new Entry(firstKey, firstValue);
            size = 1;
            setThreshold(INITIAL_CAPACITY);
        }

3,內存泄漏

因爲threadlocal中存儲值的Entry數組中的key的類型爲弱引用,而弱引用根據虛擬機規則,在垃圾回收時會直接回收,當前線程還存在時,導致數組中一個元素的key爲null,而value不爲null,get方法也無法訪問到,業績導致了內存泄漏(這個值無法使用也沒有回收)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章