浅谈ThreadLocal

一、ThreadLocal

线程局部变量,是一种并发访问变量的解决方案,与其synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用空间换时间的手段, 为每个线程提供变量的独立副本,以保证线程安全。从性能上说,不具有绝对的优势,在并发不是很高的时候加锁的性能会更好,  但作为一套完全与锁无关的线程安全解决方案,在高并发量或者激烈的场景,用ThreadLocal可以在一定程度上减少锁的竞争。

二、ThreadLocal 的几个方法:

public T get() { } // 用来获取ThreadLocal在当前线程中保存的变量副本
public void set(T value) { } //set()用来设置当前线程中变量的副本
public void remove() { } //remove()用来移除当前线程中变量的副本
protected T initialValue() { } //initialValue()是一个protected方法,一般是用来在使用时进行重写的

三、ThreadLocalMap

Thread 在内部是通过ThreadLocalMap来维护ThreadLocal变量表, 在Thread类中有一个threadLocals 变量,是ThreadLocalMap类型的,它就是为每一个线程来存储自身的ThreadLocal变量的, ThreadLocalMap是ThreadLocal类的一个内部类,这个Map里面的最小的存储单位是一个Entry, 它使用ThreadLocal作为key, 变量作为 value,这是因为在每一个线程里面,可能存在着多个ThreadLocal变量

四、初始化

初始时,在Thread里面,threadLocals为空,当通过ThreadLocal变量调用get()方法或者set()方法,就会对Thread类中的threadLocals进行初始化,并且以当前ThreadLocal变量为键值,以ThreadLocal要保存的副本变量为value,存到threadLocals。 
然后在当前线程里面,如果要使用副本变量,就可以通过get方法在threadLocals里面查找

猜你喜欢

转载自blog.csdn.net/Erin_boke/article/details/82462255