一起走进多线程(六)

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.进行初始化操作

以上就是本节内容,谢谢大家的阅读,如有错漏,欢迎评论区指正提出😚!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值