作者:
海子
本博客中未标明转载的文章归作者
海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Java学习笔记(2)
ThreadLocal
- 什么是ThreadLocal:线程本地变量,ThreadLocal为变量在每个县城中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。
- ThreadLocal类提供的几个方法:
- 1) public T get() { } :
- get()方法是用来获取ThreadLocal在当前线程中保存的变量副本
- 2) public void set (T value) { } :
- set()方法用来设置当前线程中变量的副本
- 3) public void remove() { } :
- remove()方法用来移除当前线程中变量的副本
- 4) protected T initialValue() { } :
- initialValue()是一个protected方法,一般是用来在使用时进行重写的,它是一个延迟加载方法
- Thread是如何为每个线程创建变量副本:
- step 1: 在每个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,这个threadLocals就是用来储存世纪的变量副本的,键值为当前ThreadLocal变量,value为变量副本
- step 2: 初始时,在Thread里面,threadLocals为空,当通过ThreadLocal变量调用get()方法或者set()方法,就会对Thread类中的threadLocals进行初始化,并且以当前ThreadLocal变量为键值,以ThreadLocal要保存对副本变量为value,存到threadLocals
- step 3: 然后在当前线程里面,如果要使用副本变量,就可以通过get方法在threadLocals里面查找。
总结:
1)实际上,通过ThreadLocal创建的副本是存储在每个线程自己的threadLocals中的
2)为什么threadLocals的类型ThreadLocalMap的键值为ThreadLocal对象,因为每个线程中可有多个ThreadLocal变量
3)在进行get之前必须先set,否则会报空指针异常;如果想在get之前不需要调用set就能正常访问的话,必须重写initialValue()方法
ThreadLocal使用场景:解决数据库连接,Session管理等