本篇内容介绍了“java中ThreadLocal核心方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
1、get()方法
(1)获取当前用的线程,并找到线程关联的threadLocalMap
(2)threadLocalMap为空则进行初始化一个新的并返回
(3)threadLocalMap不为空则根据threadlocal作为key查找Entry
(4)若Entry不为空则返回entry对应的值,否则执行第二条
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、remove()方法
(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核心方法怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。