- 浏览: 109924 次
- 性别:
- 来自: 杭州
文章分类
最新评论
一.什么是ThreadLocal?
ThreadLocal 是在 java.lang.包下的 在jdk1.2里引入进来 主要是给每个线程分配该线程本身的本地变量 该变量是该线程独有的 别的线程是访问不了的。
二. ThreadLocal的实现原理:
最关键的是在Thread类里有一个ThreadLocal.ThreadLocalMap threadLocals的属性,也就是说 一个线程对象生成的时候会有一个对应私有属性 threadLocals 生成 这个属性是一个 ThreadLocalMap 也就是MAP ,看ThreadLocal类的get方法:
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();
}
通过传入当前线程对象t会取得当前线程的 ThreadLocalMap 这个ThreadLocalMap key是ThreadLocal对象 值是我们传入的值OBJ,通过传入当前的ThreadLocal的对象tl(代码里的this)会取得该key对应的value就是我们set就去的对象 从而实现一个线程 有自己的独有的ThreadLocalMap 一个ThreadLocal可以取回自己作为key对应value(OBJ) 。ThreadLocalMap 可以多个key=>value(一个线程实例化多个ThreadLocal)。都是通过传递当前的Thread对象和当前的ThreadLocal对象实现取得唯一的值的。 具体如何实现请看源代码(ThreadLocal类 Thread类 ThreadLocal类里的内部类ThreadLocalMap)的各个方法 尤其是ThreadLocal类 的
get() set() remove() 等方法。
三.使用场景:
基本上需要在一个线程里保存上下文信息的 需要上下文切换的 比如session cookie等都可以用这个 spring 等框架也广泛使用了该技术。
四.注意事项:
1.在使用ThreadLocal的时候set完后线程执行完需要显性调用remove方法清除 不然在有线程池模式的WEB服务器下tomcat会出现 内存溢出和用户上下错乱(比如A用户拿到了B用户的SESSION)虽然同一个线程在执行到SET的时候会覆盖之前保留的值但是你无法控制其他人是否在SET之前有调用了。所以一定要在线程执行后remove.
PS:webx的filter和invoke都是递归调用的 第一个filter都是最先执行最后收尾的 invoke也类似。
ThreadLocal 是在 java.lang.包下的 在jdk1.2里引入进来 主要是给每个线程分配该线程本身的本地变量 该变量是该线程独有的 别的线程是访问不了的。
二. ThreadLocal的实现原理:
最关键的是在Thread类里有一个ThreadLocal.ThreadLocalMap threadLocals的属性,也就是说 一个线程对象生成的时候会有一个对应私有属性 threadLocals 生成 这个属性是一个 ThreadLocalMap 也就是MAP ,看ThreadLocal类的get方法:
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();
}
通过传入当前线程对象t会取得当前线程的 ThreadLocalMap 这个ThreadLocalMap key是ThreadLocal对象 值是我们传入的值OBJ,通过传入当前的ThreadLocal的对象tl(代码里的this)会取得该key对应的value就是我们set就去的对象 从而实现一个线程 有自己的独有的ThreadLocalMap 一个ThreadLocal可以取回自己作为key对应value(OBJ) 。ThreadLocalMap 可以多个key=>value(一个线程实例化多个ThreadLocal)。都是通过传递当前的Thread对象和当前的ThreadLocal对象实现取得唯一的值的。 具体如何实现请看源代码(ThreadLocal类 Thread类 ThreadLocal类里的内部类ThreadLocalMap)的各个方法 尤其是ThreadLocal类 的
get() set() remove() 等方法。
三.使用场景:
基本上需要在一个线程里保存上下文信息的 需要上下文切换的 比如session cookie等都可以用这个 spring 等框架也广泛使用了该技术。
四.注意事项:
1.在使用ThreadLocal的时候set完后线程执行完需要显性调用remove方法清除 不然在有线程池模式的WEB服务器下tomcat会出现 内存溢出和用户上下错乱(比如A用户拿到了B用户的SESSION)虽然同一个线程在执行到SET的时候会覆盖之前保留的值但是你无法控制其他人是否在SET之前有调用了。所以一定要在线程执行后remove.
PS:webx的filter和invoke都是递归调用的 第一个filter都是最先执行最后收尾的 invoke也类似。
发表评论
-
Java线程Dump分析工具--jstack(转摘纪录)
2015-10-29 10:47 852jstack用于打印出给 ... -
多角度看 Java 中的泛型
2014-05-13 15:40 732本文摘自:http://www.ibm.c ... -
java.lang.Object类 方法(转)
2014-05-13 10:55 2014Object类的方法 构造方法:public Obje ... -
为什么Java byte 类型的取值范围是-128~127(short int long同理)
2014-05-12 18:08 2093为什么Java byte 类型的取值范围是-128~127 ... -
web.xml之context-param,listener,filter, servlet启动顺序和讲解
2014-05-12 14:32 998首先可以确定的一点是, 不同类型节点的加载顺序与它们在web. ... -
java对象初始化书序
2014-05-09 15:05 592package com.test.aa.service; p ... -
String Stringbuilder StringBuffer区别
2014-04-17 11:00 708关于这三者的区别,我们从官方API上很容易找到答案。 ... -
JAVA反射机制
2014-04-03 15:15 339JAVA反射机制: 通俗地说,反射机制就是可以把一个类, ... -
ArrayList和linkedList几种循环性能比较
2014-03-26 17:51 627请 参照 http://www.trinea.cn/andr ... -
HashMap原理
2014-03-20 15:31 554本文由 ImportNew - 唐小娟 ... -
java.lang.Cloneable
2014-03-20 11:22 598public interface Cloneable 此类实 ... -
Java集合框架学习总结
2014-03-14 16:43 731以下介绍经常使用的集合类,这里不介绍集合类的使用方法,只介绍 ... -
maven项目管理的一些知识
2014-03-04 16:24 544http://sishuok.com/forum/blogPo ... -
ehcache使用注意 及一些问题的解决
2014-02-21 17:35 861配置 1. applicationContext.xml ... -
Xms Xmx PermSize MaxPermSize 区别
2014-02-20 16:13 640Eclipse崩溃,错误提示: ... -
JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配
2014-01-17 20:00 1130堆:顺序随意 栈:后进 ... -
debug遇到找不到源码的情况解决方案
2013-12-19 18:46 762在做JAVA开发的时候 页面端调用了接口服务端 找问题需要页面 ... -
工作学习2013-11-6
2013-11-06 20:20 5211.在用maven进行项目构建的时候 可以先建立以个maven ... -
运行jtest出现 No value found for property database.type 错误解决办法
2013-06-06 11:25 1773错误信息: Caused by: org.jtester.mo ...
相关推荐
在Java 2(J2SE)中,`java.lang`包添加了一些新的类和方法,如`InheritableThreadLocal`,`ThreadLocal`的扩展,使得子线程可以继承父线程的变量,以及`SecurityManager`,用于实现安全管理策略。 过时方法在Java ...
### 知识点详解:Java.lang.ThreadLocal 类 #### 一、概述 **ThreadLocal** 并非线程的一种特殊实现形式,而是一种为每个线程提供独立副本的机制,通常被称为“线程局部变量”。这种机制使得每个线程都可以独立...
《java_lang包详解》 Java语言的核心库之一就是java.lang包,它包含了Java程序中最基础、最核心的类和接口。由于这个包是自动导入到每个Java程序中的,所以理解和掌握其中的类和接口对于编写Java代码至关重要。下面...
值得注意的是,虽然`java.lang`包中的许多类在早期版本的Java中就已经存在,但随着时间的推移,一些方法已被标记为过时。过时方法通常是出于兼容性考虑而保留的,但不应在新代码中使用,以遵循最佳实践。 总的来说...
总结,`java.lang`包是Java的核心,包含了一系列基础类和接口,它们为Java程序提供了基本的运算、数据类型转换以及多线程、安全性等方面的支持。理解和熟练使用这些类和接口是掌握Java编程的关键。
### Java中ThreadLocal详解 #### 一、ThreadLocal概述 在Java多线程编程中,`ThreadLocal`是一个非常重要的工具类,它提供了一种在每个线程内部存储线程私有实例的方法。通常情况下,当多个线程共享某个变量时,...
解决mongo数据插入时 报错问题 mogodb插入数据时报错Can't find a codec for class java.math.BigDecimal
关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. ...
Java ThreadLocal详解 ThreadLocal是Java中的一种机制,可以将变量与线程关联起来,使得每个线程都可以拥有自己的变量副本。 ThreadLocal的出现是为了解决多线程编程中的线程安全问题。 从本质上说,ThreadLocal是...
【标题】:“线程本地(ThreadLocal):Java.lang.ThreadLocal 的实验性无等待并发实现” 在Java编程中,`ThreadLocal`是一个非常重要的工具类,它提供了线程局部变量的功能。线程局部变量是局限于单个线程的变量,...
04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、...
Java编程语言中的java.lang包是一个核心包,它提供了Java语言运行时的基础类库,包含了Java程序运行的基本数据类型、异常处理类以及一些用于系统级别的工具类和接口。java.lang包中的类和接口不需要程序员显示地导入...
`ThreadLocal`的全称是`java.lang.ThreadLocal`,它并不是一个线程,而是一个线程局部变量的容器。`ThreadLocal`的工作原理是为每个线程创建一个单独的实例副本,这些副本存储在一个与线程相关的映射表中。当线程...
threadLocal.set("这是线程A的值"); ``` 3. **获取线程局部变量的值:** 当你需要访问这个值时,使用`get()`方法。这将返回与当前线程关联的值。 ```java String value = threadLocal.get(); // 返回"这是线程A的...
ThreadLocal 相关知识点 ThreadLocal 是 Java 语言中的一种机制,用于提供线程内部的局部变量。...然而,开发者也需要注意 ThreadLocal 的缺点,合理地使用 ThreadLocal 来提高代码的效率和可维护性。
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
本文将深入探讨`java.lang`包中的关键组件,包括`Number`类及其子类、`Double`和`Float`的特性和方法,以及`Character`和`String`等。 首先,`Number`类是所有数值类型的基类,如`Byte`, `Short`, `Integer`, `Long...
3. **注意事项**: - ThreadLocal并不是一个无限大的存储空间,长时间不清理可能导致内存泄漏。当线程结束时,ThreadLocal中的数据不会自动清除,因此建议在不再使用时显式调用`threadLocal.remove()`。 - ...
threadLocal.set("线程局部的值"); ``` 3. **获取值**:通过`get()`方法获取当前线程的ThreadLocal变量的值。 ```java String value = threadLocal.get(); ``` 4. **移除值**:当不再需要ThreadLocal变量时,可以...