3.ThreadLocal
前面提到了synchronized关键字,ThreadLocal与synchronized关键字都是用来处理并发访问的,但是synchronized是利用了锁机制,同一时间只有一个线程能访问方法或代码块。而ThreadLocal为每个线程提供了变量的副本,每个线程访问自己的并非同一个变量。用到ThreadLocal的地方有很多,例如读写锁中的每个线程重入读锁的次数就是存在线程自身的ThreadLocal中。
ThreadLocal的使用主要是下面四个方法:
public T get() 得到当前线程的局部变量值
protected T initialValue() 初始化,这个方法采用了延迟调用,在第一次调用set和get时才会初始化。
public void set(T value) 设置当前线程局部变量的值
public void remove() 移除当前线程局部变量的值
那么每个线程是怎么存放数据的呢?我们从ThreadLocal源码中看看
可以发现ThreadLocal中定义了一个ThreadLocalMap的数据结构,在这个数据结构中,用Entry数组来存放数据,而这个Entry结构是一个key-value结构,key的类型是我们定义的ThreadLocal类型,而值就是每个线程特有的值。之所以用Entry数组而不是单个Entry,是因为有可能有多个ThreadLocal变量。可以这么说,每个线程都有一个ThreadLocalMap,而这个Map中的Key就是ThreadLocal<>,而对应的value就是我们线程自有的值。
我们可以看看怎么获取数据的,这样对ThreadLocal和ThreadLocalMap会更加了解:
1.首先获取到当前线程
2.拿到当前线程的ThreadLocalMap 这里就可以看出分隔开每个线程的数据
如果map不为空
3.拿到map中存储当前这个(this)ThreadLocal的Entry
如果这个Entry存在
4.返回这个Entry中的值
如果map为空
5.进行初始化操作
以上就是本节内容,谢谢大家的阅读,如有错漏,欢迎评论区指正提出😚!