加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 对ThreadLocal感到困惑

发布时间:2020-12-14 23:58:37 所属栏目:Java 来源:网络整理
导读:我今天早上刚刚了解了ThreadLocal.我读到它应该总是最终的和静态的: private static final ThreadLocalSession threadLocal = new ThreadLocalSession(); (Session是一个Hibernate会话) 我的困惑是:因为它是静态的,所以JVM中的任何线程都可以使用它.然而,
我今天早上刚刚了解了ThreadLocal.我读到它应该总是最终的和静态的:
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

(Session是一个Hibernate会话)

我的困惑是:因为它是静态的,所以JVM中的任何线程都可以使用它.然而,它会保存访问它的每个线程的本地信息吗?我试图绕过这个,所以如果不清楚我会道歉.应用程序中的每个线程都可以访问相同的ThreadLocal对象,但ThreadLocal对象将存储每个线程的本地对象?

解决方法

是的,实例将是相同的,但是当您设置和检索时,代码会附加您使用Thread.currentThread()设置的值,因此当使用方法访问时,可以在当前线程内访问值集设定并得到.

它真的很容易理解.

想象一下,每个Thread都有一个将值与ThreadLocal实例相关联的映射.每次在ThreadLocal上执行get或set时,ThreadLocal的实现都会获取与当前Thread(Thread.currentThread())相关联的映射,并使用自身作为键在该映射中执行get或set.

例:

ThreadLocal tl = new ThreadLocal();
tl.set(new Object()); // in this moment the implementation will do something similar to Thread.getCurrentThread().threadLocals.put(tl,[object you gave]) 

Object obj = t1.get(); // in this moment the implementation will do something similar to Thread.getCurrentThread().threadLocals.get(tl)

而有趣的是ThreadLocal是层次结构的,这意味着如果你为父线程定义了一个值,它将可以从子线程访问.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读