国产成人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电脑。)

关注

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

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

成品人和精品人的区别在哪里知乎| 我把刘姨俩腿扛在肩上是哪一集的 | 《炸裂吧!巨棒》免费阅读漫画| 苍井空做爰高潮A片| 在线天堂WWW在线观看图片| 斗鱼静宝宝| 亚洲乱熟女一区二区三区山口珠理| 男生困困进女生困困洞视频| 美女和帅哥一起努力生产豆浆的视.| 不扣钮的女孩| B站暴躁女RAPPER| 打扑克不盖被子| 坤坤寒入桃子里电视剧| 百色助学网| 老师穿黑色双开真丝旗袍如何穿芭.. | 强多干伦久久久久久久久| 小叔子从后面抱住我的电视剧| 妈妈的绣感7| 情满四合院 电视剧| 美女和帅哥一起努力生产豆浆| 王丽娟一夜被躁五次| 狼人加鲁鲁兽天赋澳彩心水| 欧美精品| 依卡| 真人刺激战场40分钟电视剧| 打开网站免费进入| 情趣内衣秀| 男生将78申请女生的定眼| 拔小萝卜免费观看全集电视剧| 男人把J8放进女人的P里| 成品动漫网站入口网页版怎样| 星空传媒天美传媒有限公司| 窝窝影院在线观看免费播放电视剧| 公司企业文化展示墙| 黑人空乘伦理5| 百度推荐官| 泰国电影《初次深交流》| 少女国产免费观看高清电视剧| 三男一女免费播放电视剧大全| 青柠影院在线观看高清电视剧荣耀 | 星空无限MV国产剧入选精彩