public T get(){
Thread t = Thread.currentThread();
ThreadLocalMap map =getMap(t);if(map != null){
ThreadLocalMap.Entry e = map.getEntry(this);if(e != null){@SuppressWarnings("unchecked")
T result =(T)e.value;return result;}}returnsetInitialValue();}
private T setInitialValue(){
T value =initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map =getMap(t);if(map != null)
map.set(this, value);elsecreateMap(t, value);return value;}
private Entry getEntry(ThreadLocal<?> key){int i = key.threadLocalHashCode &(table.length -1);
Entry e = table[i];if(e != null && e.get()== key)return e;elsereturngetEntryAfterMiss(key, i, e);}
可以看到函数一开始就对此TreadLocal进行hash算法,得到它所对应数组下标i,然后判断此下标处保存的key是否和当前key一样,如果一样说明找到了正确的键值对,直接返回e。如果不一样就调用getEntryAfterMiss(key, i, e)方法,这个方法源码里面是使用线性探测的方法去找对应的key值,如果找不到就返回null。
如果返回了正确的Entry e,就将e的value值作为get的返回值。
三、remove()方法
源码如下:
publicvoidremove(){
ThreadLocalMap m =getMap(Thread.currentThread());if(m != null)
m.remove(this);}
直接调用了ThreadLocalMap的remove方法。
privatevoidremove(ThreadLocal<?> key){
Entry[] tab = table;int len = tab.length;int i = key.threadLocalHashCode &(len-1);for(Entry e = tab[i];
e != null;
e = tab[i =nextIndex(i, len)]){if(e.get()== key){
e.clear();expungeStaleEntry(i);return;}}}