1.get() 메소드
(1) 현재 사용되는 스레드를 가져오고 스레드와 연관된 threadLocalMap을 찾습니다.
(2) threadLocalMap이 비어 있으면 새 스레드를 초기화하고 반환합니다.
(3) threadLocalMap은 not 비어 있으면 threadlocal을 키로 사용하여 항목을 찾습니다
(4) 항목이 비어 있지 않으면 항목에 해당하는 값을 반환하고, 그렇지 않으면 두 번째
public T get() { // 获取当前线程 Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); //若当前线程关联的ThreadLocal不为空则查询 if (map != null) { //根据threadLocal查询对应的Entry ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } return setInitialValue(); } private T setInitialValue() { //默认返回null值 T value = initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); //如果当前调用线程关联的ThreadLocalMap为空则创建,否则设置值进去 if (map != null) map.set(this, value); else //new ThreadLocalMap(this,value) createMap(t, value); return value; } private Entry getEntry(ThreadLocal<?> key) { //根据key获取其在数组的下标位置 int i = key.threadLocalHashCode & (table.length - 1); Entry e = table[i]; if (e != null && e.get() == key) return e; else return getEntryAfterMiss(key, i, e); } private Entry getEntryAfterMiss(ThreadLocal<?> key, int i, Entry e) { Entry[] tab = table; int len = tab.length; //数组下标的Entry不为空且关联的threadlocal与查找的threadlocal不一致 while (e != null) { ThreadLocal<?> k = e.get(); //entry关联的threadlocal与查找的相等则直接返回 if (k == key) return e; if (k == null) //关联的threadlocal为空,则触发清理key为null的Entry并重新进行rehash旧Entry数组的元素 //threadLocalMap的hash冲突与hashMap的冲突处理方式不一致,hashMap使用的是链表地址法, //而threadLocalMap使用的开放地址法——线性探测,即顺序查找下一位置或者遍历全表,效率较低 expungeStaleEntry(i); else //递增下标i的值进行下一轮的查找 i = nextIndex(i, len); e = tab[i]; } return null; }
2, 제거() 메서드를 실행합니다.
(1) 현재 사용자 스레드를 가져오고 스레드와 연결된 threadLocalMap을 찾습니다
(2) 비어 있지 않으면 threadLocalMap에서 연결된 값을 삭제하고, 그렇지 않으면 아무것도 하지 않습니다
//ThreadLocal public void remove() { ThreadLocalMap m = getMap(Thread.currentThread()); if (m != null) //删除当前threadLocal对象关联的Entry m.remove(this); } //ThreadLocalMap private void remove(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; } } }
위 내용은 Java에서 ThreadLocal 코어 메소드를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!