郁闷,本想学习Hibernate来着,看着看着就发现Hibernate用到了ThreadLocal,我嚓,好熟悉,哦,我知道了,本地线程嘛,easy!错,它和线程根本就扯不上任何猫关系(PS:上个月鹿樵问我来着,我说没用过)
对于应用场合和概念就不分析了,javaeye上有人分析的不错了已经。主要看下源码哈。
/**
* Returns the value in the current thread's copy of this thread-local
* variable. Creates and initializes the copy if this is the first time
* the thread has called this method.
*
*/
public Object get() {
Thread t = Thread.currentThread();
//ThreadLocalMap是 static inner class ,骂吧的一提到内部类就想到Hashmap纠结啊! 这个Hashmap维护了key是线程号,value是变量副本的结构
ThreadLocalMap map = getMap(t);
if (map != null)
return map.get(this);//根据thread查找对应的变量副本
// Maps are constructed lazily. if the map for this thread
// doesn't exist, create it, with this ThreadLocal and its
// initial value as its only entry.
//第一次访问的时候才执行,第一次默认返回null,如果不想要null,你懂的,哦,我懂的
Object value = initialValue();
createMap(t, value);
return value;
}
//protected,不用我多说,一看就知道是什么目的,擦,return null
protected Object initialValue() {
return null;
}
//new 一个ThreadLocalMap对象吧,第一次搞进去个null,以后就随便搞吧
void createMap(Thread t, Object firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
public void set(Object value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
其实,感觉就是外面加了一个衣服一样,有get和set方法,内部结构用Hashmap实现,速度快一点点啦。19点30了,赶紧下班走人。哎,hibernate还没看完,到引出这么一坛子事情。
分享到:
相关推荐
### 知识点详解:Java.lang.ThreadLocal 类 #### 一、概述 **ThreadLocal** 并非线程的一种特殊实现形式,而是一种为每个线程提供独立副本的机制,通常被称为“线程局部变量”。这种机制使得每个线程都可以独立...
解决mongo数据插入时 报错问题 mogodb插入数据时报错Can't find a codec for class java.math.BigDecimal
在Java 2(J2SE)中,`java.lang`包添加了一些新的类和方法,如`InheritableThreadLocal`,`ThreadLocal`的扩展,使得子线程可以继承父线程的变量,以及`SecurityManager`,用于实现安全管理策略。 过时方法在Java ...
【标题】:“线程本地(ThreadLocal):Java.lang.ThreadLocal 的实验性无等待并发实现” 在Java编程中,`ThreadLocal`是一个非常重要的工具类,它提供了线程局部变量的功能。线程局部变量是局限于单个线程的变量,...
java.lang包还包含了一些与安全、线程和内存管理相关的类,如SecurityManager用于安全管理,Thread和ThreadGroup是线程相关的类,ClassLoader负责加载类,ThreadLocal为每个线程提供独立的变量副本,而Runtime类提供...
最后,`Thread`和`ThreadGroup`类构成了Java的多线程机制,`ThreadLocal`则提供线程私有的变量,确保每个线程都有自己的副本,不会互相干扰。 总的来说,`java.lang`包是Java程序的基础,其提供的类和接口构成了...
在Java 2中,一些新类和方法被添加到`java.lang`包,如`ThreadLocal`、`RuntimePermission`等,以增强安全性、多线程支持和性能优化。 值得注意的是,虽然`java.lang`包中的许多类在早期版本的Java中就已经存在,但...
Java编程语言中的java.lang包是一个核心包,它提供了Java语言运行时的基础类库,包含了Java程序运行的基本数据类型、异常处理类以及一些用于系统级别的工具类和接口。java.lang包中的类和接口不需要程序员显示地导入...
在Java编程语言中,`java.lang`包是所有Java程序的基础,因为它包含了许多核心类和接口,这些类和接口是编写任何Java应用程序所必需的。由于这个包是自动导入的,因此程序员无需在代码中显式地导入`java.lang`。 1....
ThreadLocal,全称为`java.lang.ThreadLocal`,是Java中一个非常重要的工具类,它主要用于在多线程环境中提供线程局部变量。ThreadLocal不是用来解决线程安全问题的,而是为每个线程创建独立的变量副本,确保线程间...
`ThreadLocal`的全称是`java.lang.ThreadLocal`,它并不是一个线程,而是一个线程局部变量的容器。`ThreadLocal`的工作原理是为每个线程创建一个单独的实例副本,这些副本存储在一个与线程相关的映射表中。当线程...
Java线程是多任务编程中的核心概念,尤其在Java中,理解并掌握线程...解压后,你可以深入学习线程的调度策略、线程局部变量(`ThreadLocal`)、线程优先级以及其他并发工具类的使用,进一步提升你的Java并发编程能力。
4. **多线程**:`java.lang.Thread`和`java.util.concurrent`包提供了线程相关类和接口,用于实现并发编程,如`Runnable`、`ThreadLocal`、`ExecutorService`。 5. **网络编程**:`java.net`包包含网络通信所需的...
JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。当目标对象实现了至少一个接口时,Spring会使用JDK的动态代理来创建一个代理对象,这个代理对象会拦截所有对目标...
java.lang - **Short**、**Integer**等包装类提供了数值转换、比较等方法。 - **String**:不可变字符串类,支持多种操作,如拼接、查找、替换等。 - **Thread**:用于创建和管理线程,提供了启动、中断、等待等...
早在 JDK 1.2 的时代,java.lang.ThreadLocal 就诞生了,它是为了解决多线程并发问题而设计的,只不过设计得有些难用,所以至今没有得到广泛使用。其实它还是挺有用的,不相信的话,我们一起来看看这个例子吧。 一个...
1. java.lang.management.*、javax.management.* 泛型 1. 泛型与继承类型擦除 2. 泛型中 K T V E 等的含义 3. 泛型各种用法 单元测试 1. junit、mock、mockito、内存数据库(h2) 正则表达式 1. java.lang....
3. **并发编程**:`java.util.concurrent`包提供了高效的并发工具,如ExecutorService、Future、Callable、ThreadLocal和各种并发集合(ConcurrentHashMap、CopyOnWriteArrayList等),以及锁和同步工具类。...
5. **线程局部变量改进** (`ThreadLocal`):虽然Java 9没有直接改变`ThreadLocal` API,但它提供了一个`ThreadLocalRandom`类,这个类为每个线程提供了一个独立的随机数生成器,避免了线程安全问题,提高了并发性能...