文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java中有哪些ThreadLocal核心方法

2023-06-14 17:59

关注

这篇文章将为大家详细讲解有关java中有哪些ThreadLocal核心方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Java可以用来干什么

Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页开发;5. 企业级应用开发;6. Java大数据开发;7.游戏开发等。

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中关联的值,否则啥也不做

//ThreadLocalpublic void remove() {    ThreadLocalMap m = getMap(Thread.currentThread());    if (m != null)        //删除当前threadLocal对象关联的Entry        m.remove(this);} //ThreadLocalMapprivate 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核心方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯