最近看一些面經,好像很多時候都有提到threallocal的實現原理,之前在學習多執行緒的時候似乎沒有太注意threadlocal這個本地執行緒,現在看看原始碼,學習一下。
threadlocal是執行緒內部的資料儲存類,通過它可以指定的執行緒中儲存資料,資料儲存以後,只有在指定執行緒中可以獲取到儲存的資料,對於其他執行緒來說則無法獲取資料.
自定義實現乙個threadlocal,先定義乙個map,將當前執行緒作為key,執行緒擁有的資料作為值存入map,實現value為當前執行緒私有。
/**
* @classname mythreadlocal
* @description: 自定義乙個簡易threadlocal
* @author zhouyang
* @date 2019/5/22 下午9:55.
*/public class mythreadlocal
//取值
public synchronized t get()
}
自定義可以完成基本功能,但是在多執行緒中效能較差,會發生衝突。
原始碼中的set和get方法,保證了各個執行緒之間的資料互不干擾。
public void set(t value)
public t get()
}return setinitialvalue();
}threadlocalmap getmap(thread t)
thredlocalmap是threadlocal中的乙個內部類,用於儲存執行緒的threadlocalmap物件。
static class threadlocalmap
}private entry table;
private static final int initial_capacity = 16;
private int threshold;
threadlocalmap(threadlocal firstkey, object firstvalue)
// 設定擴容resize時的閾值
private void setthreshold(int len)
}
在threadloalmap中,也是初始化乙個大小16的entry陣列,entry物件用來儲存每乙個key-value鍵值對,只不過這裡的key永遠都是threadlocal物件,是不是很神奇,通過threadlocal物件的set方法,結果把threadlocal物件自己當做key,放進了threadloalmap中。
這裡需要注意的是,threadloalmap的entry是繼承weakreference,和hashmap很大的區別是,entry中沒有next欄位,所以就不存在鍊錶的情況了。
在threadlocalmap中,資料的存入原始碼:
/**
* set the value associated with key.
** @param key the thread local object
* @param value the value to be set
*/private void set(threadlocal<?> key, object value)
if (k == null)
}tab[i] = new entry(key, value);
int sz = ++size;
if (!cleansomeslots(i, sz) && sz >= threshold)
rehash();
}
在插入過程中,根據threadlocal物件的hash值,定位到table中的位置i,過程如下:
如果使用threadlocal的set方法之後,沒有顯示的呼叫remove方法,就有可能發生記憶體洩露,所以養成良好的程式設計習慣十分重要,使用完threadlocal之後,記得呼叫remove方法。
threadlocallocalname = new threadlocal();
try finally
ThreadLocal 學習測試筆記
不同執行緒通過thread.currentthread 方法獲取當前執行緒 set方法以當前執行緒為key,值為value放入threadlocalmap中 以此區分不同執行緒 get方法以當前執行緒為key,在map中查詢對應的value public static void main strin...
ThreadLocal變數學習
threadlocal即本地執行緒,被threadlocal修飾的變數會在每個執行緒的私有緩衝內複製乙個完全相同的物件副本,從而避免了變數共享時候的執行緒安全問題 package thread.threadlocal public class threadlocalvariabletest publ...
ThreadLocal學習總結
public class threadlocaltest 測試threadlocal system.out.println threadlocal.get 學習threadlocal,首先先從它的資料結構開始,threadlocal的內部類threadlocalmap 只是擷取部分 static c...