国产成人AV无码一二三区,少女1到100集,国产精品久久久久精品综合紧,巜公妇之诱感肉欲HD在线播放

文章 > java基础 > java中ThreadLocal核心方法有哪些?

java中ThreadLocal核心方法有哪些?

java ThreadLocal

头像

小妮浅浅

2021-03-10 16:47:143296浏览 · 0收藏 · 0评论

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核心方法介绍,大家会发现这些方法我们在其他的模块也有使用到。想要对其他核心方法有所了解,也可以在课后自行查阅资料。

(本教程推荐操作环境:windows7系统、java10版,DELL G3电脑。)

关注

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

穿真空短裙挤公交会被赶走吗| 《俄罗斯空姐2(俄罗斯航空)》| 免费观看已满十八岁电视剧在线播...| 老公弄我一边干一边说粗话视频| 停不了的爱温碧霞| 万能浏览器| 漂亮的女邻居5》HD| 孤男寡女免费观看高清电视剧狂飙 | 适合做前看的短篇小说| 《疯狂72小时》韩剧| 黑料社区| 快乐公媳1-36集全免费看| 女生给男生吃小头头| 《相濡以沫的夜晚》动漫免费全部| 海角社区-吃瓜黑料-爆料海角| 免费观看B站刺激战场2023| 欧美一区二区| 《肉体暴力强伦轩》| 姑父有力挺送小芳的背景故事| 2025国产拍视频最好的手机| 《湿点》未增减板相似| 《下班后的办公室》上线| 有夫之妇精油按摩的功效与作用| 男朋友隔着衣服顶撞是什么心理现.. | 深入无人区短剧免费高清观看| 三女片免费观看电视剧杨贵妃传| 交替轮换4| 桃色三国| 征服双收岳女两2| 成品PPT网站大片入口| 少妇大屁股白浆流出白浆| CSGO未满十八岁能玩多久 | 欧美《禁忌5》| 17CC吃瓜网最新爆料新闻| BOBO浏览器| A片| 美女的胸怀| 小诗的高中日记1-15| 《借种生子》电影免费观看| X姓女RAPPER的首次亮相| 年轻的妈妈