1. ThreadLocal介绍
ThreadLocal提供了线程局部变量,每个线程都有各自独立的局部变量,其他线程无法访问得到,这就隔离多个线程之间的资源共享问题,也不会出现线程安全问题,而一般应用是在数据库连接,或者session等地方。
1.1 应用:数据库连接
操作数据库连接时,有getConnection和closeConnection,要是多线程操作的话,有一个线程getConnection后还未操作时,就被另一个线程closeConnection了,就会出现问题,的确是可以用锁将这获取连接和关闭连接给锁起来,就不会出现这种情况,可是这样导致每次只能有一个线程在操作数据库,极大降低了效率,所以采用ThreadLocal的方式将Connection设置成每个线程的局部变量,就能满足需求了。
1.2 应用:保持用户登录状态
在用户登录后,通过一个Holder类来保存用户的信息,而此时这个用户信息是需要独立于其他线程的,其他用户登录却不能访问到各自的信息,所以此时就在Holder类内部维护一个ThreadLocal类型的变量。
|
|
2. ThreadLocal原理
ThreadLocal是通过其内的内部类ThreadLocalMap来保证每个线程都有独有的变量,互相访问不了,可以当做是局部变量,外界访问不了,每个线程都有各自独有的ThreadLocalMap,map里面放置变量。
①ThreadLocal对象:定义ThreadLocalMap以及相关方法
②ThreadLocalMap对象:key是this(当前ThreadLocal对象),value是设置的值,保存在Thread中
③threadLocals:当前线程的map对象,是在Thread内维护的
3. ThreadLocal源码解读
3.1 getMap:返回对应线程的map
|
|
3.2 set
|
|
3.3 get
|
|
3.4 remove
|
|