java之threadlocal的使用
基本介绍
ThreadLocal很多地方叫线程本地变量,或者叫线程本地存储。ThreadLocal为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突,实现线程间的数据隔离,至于是如何实现的,下面会在实现原理中介绍。但是我们需要知道,threadLocal只是实现了变量在不同线程中的数据隔离,即保证了同一变量在不同的线程中传递时可以有不同的值,换句话说ThreadLocal构建的是在同一线程中的全局变量,并没有解决共享变量的问题,在多线程并发访问共享变量时依然会出现并发问题,当然更不存在解决了什么同步问题。
但是这里有个ThreadLocal使用的误区,因为ThreadLocal能够是的参数在不同的方法中使用,所以有些小伙伴为了避免方法中写了过多的参数就把参数的使用这些参数放到了threadLocal中,其实这是不合理的设计,也不是ThreadLocal设计的初衷。
使用场景
变量在每个线程需要有自己单独的实例
实例需要在整个线程中共享,但不希望被多线程共享
实现原理
要想了解ThreadLocal是如何为每个线程实现数据隔离的,就需要了解下ThreadLocal中几个重要的方法了。其实冲get和getMap方法中就可以明白了,每个线程中变量实例其实是放在一个类型为ThreadLocalMap的map的Value中的,而这个map是通过Thread中的变量threadLoacls来获得的,这样一来这个变量的值就会只存在于这个线程。另外我们注意到map中key是this,也就是ThreadLocal的实例,这也就是保证了不同的线程中使用的是同一个变量,但是可以有不同的值。
ThreadLocal 是 JDK底层提供的一个解决多线程并发问题的工具类,它为每个线程提供了一个本地的副本变量机制,实现了和其它线程隔离,并且这种变量只在本线程的生命周期内起作用,可以减少同一个线程内多个方法之间的公共变量传递的复杂度。
举一个比较形象的例子(自己想的,说的不好请多多指正):中学时期,我们经常会有这样一个场景:老师把布置的作业写到黑板上,没有 ThreadLocal 这种机制的话是这样的,有一个很大的作业本,每个学生把自己的作业都写到这一个笔记本上面属于自己的那一块区域上。而我们也知道,实际的场景XM返佣https://www.kaifx.cn/broker/xm.html是每个同学都有一个自己的作业本,把各自的作业抄写到自己的作业本上面,就实现了和其它同学的作业隔离,感觉这个比较像 ThreadLocal 的工作原理。
运行结果:
B:48
A:32
即:线程A与线程B中ThreadLocal保存的整型变量是各自独立的,互不相干,只要在每个线程内部使用set方法赋值,然后在线程内部使用get就能取到对应的值。
|
|