ThreadLocal<T>
- ThreadLocal中的基本存储结构是ThreadLocalMap。其中使用到了一个基础对象:WeakReference<T>,WeakReference(弱引用)指当需要某个指向某对象的引用,但又不影响此对象的垃圾收集,应该使用此对象代替一般的 reference。即,这个对象在除了WeakReference以外没有其他引用指向时,可以被垃圾回收,此时弱引用会变为null值。
- ThreadLocalMap使用和普通Map相同的方式,只是每个元素都是WeakReference的子类。保证线程回收时,对象能够被垃圾回收。
static class Entry extends WeakReference<ThreadLocal> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal k, Object v) {
super(k);
value = v;
}
}
ThreadLocal中的ThreadLocalMap是被注入存储到Thread中的。ThreadLocalMap的key是ThreadLocal本身(属性进行某种运算得到),而value是不同的ThreadLocal对应的set方法设置的值。每个Thread只会有一个ThreadLocalMap。需要注意的就是,ThreadLocal不是一个存储结构,也不会包含存储结构。所以ThreadLocal可以理解为一个帮助线程存储数据的工具类。
public class Thread implements Runnable {
...
/*
* ThreadLocal values pertaining to this thread. This map is maintained by the ThreadLocal
* class.
*/
ThreadLocal.ThreadLocalMap threadLocals = null;
...
}
public class ThreadLocal<T> {
...
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
...
}
get方法是直接取当前Thread的ThreadLocalMap中,当前ThreadLocal对应的值。
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T) e.value;
}
return setInitialValue();
}
出处:http://wu-sheng.iteye.com/blog/946240
分享到:
相关推荐
在Java开发过程中,我们经常会遇到`java.lang.NoClassDefFoundError`这个异常,尤其是在进行JDK版本升级时。这个错误通常表示在运行时找不到某个类的定义,即使编译时该类是可用的。在本例中,问题发生在从一个较低...
### java.lang.UnsupportedClassVersionError问题解析与解决方案 在Java开发过程中,经常会在部署或运行时遇到`java.lang.UnsupportedClassVersionError`错误。该错误通常发生在类文件版本与JVM(Java虚拟机)版本...
<br><br>本系统是WEB模式的新闻发布管理系统<br>运行环境:Tomact+JDK<br>编程模式:JSP+JavaBean+JavaServlet<br>后台数据库:MySql\Access<br><br>系统主要完成的功能如下:<br><br>管理员(后台)<br>.系统管理:用户...
实验室教学管理系统(Web版 全套源码 安装即用)<br><br>本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。<br><br>系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...
For example:<br><br> jad -o -dtest -sjava *.class<br><br> (or jad -o -d test -s java *.class, which has the same effect)<br><br>This command decompiles all .class files in the current directory <br>...
在Java 6、7和8中,Java平台的标准版(Java SE)包含了Java企业版(Java EE)的一些API,如JAXB(Java Architecture for XML Binding)。然而,从Java 9开始,为了实现模块化并提高系统的可维护性和安全性,Java EE...
JDK1.8【函数式接口】【定义与使用】【源码】 文章地址:https://blog.csdn.net/m0_37969197/article/details/124146253 * 函数式接口(类的定义与适应形式,只是一种类的定义形式,属于新增语法) * 包:java....
实验室教学管理系统(Web版 全套源码 安装即用)<br><br>本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。<br><br>系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...
<br><br>本系统是Web模式的在线考试管理系统<br><br>运行环境:Tomact+JDK<br><br>编程模式:JSP+JavaBean+JavaServlet<br><br>后台数据库:MS-Access<br><br>系统主要完成的功能如下:<br><br>.基本信息管理 考生...
<br><br>本系统是WEB模式的航空订票系统管理系统<br>运行环境:Tomact+JDK<br>编程模式:JSP+JavaBean+JavaServlet<br>后台数据库:MS-Access<br><br>系统主要完成的功能如下:<br><br> _订票信息管理功能 _客机信息...
<br><br>本系统是Web模式的办公自动化系统<br><br>运行环境:Tomact+JDK<br>编程模式:JSP+JavaBean+JavaServlet<br>后台数据库:MS-Access<br><br>系统主要功能简介:<br><br>.信息中心 <br><br>.内部电子邮件<br>...
Java中的`java.lang.UnsatisfiedLinkError`是一个常见的运行时异常,通常出现在Java试图加载本地(C或C++)库但找不到相应的库文件时。这个错误可能是由于多种原因引起的,如库路径设置不正确、库文件不存在或者版本...
解决 java.lang.RuntimeException: Could not generate DH keypair异常处理。 bcprov-ext-jdk15on-1.60、bcprov-jdk15on-1.60两个包放到jre下的$JAVA_HOME/jre/lib/ext的路径下,然后配置$JAVA_HOME/jre/lib/...
在与银联的对接中,调试过程中报错或使用类似登入加密:java.lang.SecurityException: JCE cannot authenticate the provider BC 进行问题解决,里面包含 bcprov-jdk16-143.jar与bcprov-jdk15-135.jar与具体文件存放...
- 在弹出的属性设置窗口中,选择左侧的“Build-->Java”选项。 - 在右侧的界面中,你会看到四个下拉框,分别是“Compiler”、“Debug Option”、“Language Features”和“Target VM”。 - 对于“Compiler”和...
spring boot2快速导出excel的示例源码 操作系统:windows10 JAVA jdk:1.8 开发工具:IDEA java架构:spring boot 2.1.6 gitHub:https://github.com/cn-h-jar/exportexcel 作者:jar 运行提示: 启动项目...
java.lang.OutOfMemoryError: PermGen space 解决方案
<Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature> ...
由于本机安装的jdk版本与tomcat中使用的jdk版本不一致导致的。 解决方法 后面我把原先tomcat启动环境用的jdk1.7改为了本机安装的jdk1.8就不在报错。 具体过程: 在myeclipse中点击window→preference→在搜索框中...
标题中的“jboss7.1.1下报java.lang.SecurityException: JCE cannot authenticate the provider BC”是一个典型的Java安全异常,通常发生在尝试使用不受信任的加密提供者时。在这个问题中,"BC"指的是Bouncy Castle...