国产成人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》电影在线观看| 蜜桃| 公车上双乳被两男人夹击电影| 动漫《纯洁的修女》在线看| 法国急救宝贝2| 4399在线观看免费高清电视剧| 抵达花心乖叫老公是第几集| 坤坤寒入桃子里电视剧| 秘书奶头好大下面好紧| 夫妻二人世界免费看第一集| 美国式禁忌3乱偷| 欧美大片视频| 爸爸的大DJ小说| | 星空无限MV国产剧入选精彩 | 女人荫蒂被添全过程A片免费| 公交车掀开奶罩边躁狠狠躁漫画| 按在阳台上疯狂的进入| 喜爱夜蒲在线观看| 妙手房术3真人版| 女生的全身照曝光| 《性房纵欲》在线观看| 儿媳妇长太漂亮免费观看电视剧 | 老师穿白色双开真丝旗袍怎么穿| 《如狼似虎的女人》大结局| 星空无痕MV免费视频观看| 韩浸免费观看下拉式浸画软件测评| 伦理《禁忌12》| 免费视频在线观看人数在哪直播| 三个领导换着躁我几小时在线观看| 《丰满的女邻居》播放| FOAM| 我的邻居的老婆2完整版电视剧 | 400部精品国偷自产在线| 双乳被四个男人吃奶H文| 19岁大学生少女免费观看电视剧| 小饰品| 韩剧《酒醉热吻》| 活着 韩国| 美丽代价