java – 对ThreadLocal感到困惑

前端之家收集整理的这篇文章主要介绍了java – 对ThreadLocal感到困惑前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我今天早上刚刚了解了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是层次结构的,这意味着如果你为父线程定义了一个值,它将可以从子线程访问.

原文链接:https://www.f2er.com/java/127100.html

猜你在找的Java相关文章