[JAVA]深⼊讲解ThreadLocal变量通常设置为static的原因
⽂章⽬录
什么是ThreadLocal:
JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了⼀种新的思路。使⽤这个⼯具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是⼀个Thread,⽽是Thread的局部变量。ThreadLocal的作⽤是提供线程范围内的局部变量,这种变量在线程的⽣命周期内起作⽤。作⽤:提供⼀个线程内公共变量,减少同⼀个线程内多个函数或者组件之间⼀些公共变量的传递的复杂度,或者为线程提供⼀个私有的变量副本,这样每⼀个线程都可以随意修改⾃⼰的变量副本,⽽不会对其他线程产⽣影响,真正诠释了“Local”的含义。
Java static:
在Java语⾔中,static表⽰“静态”的意思,使⽤场景可以⽤来修饰成员变量和成员⽅法,当然也可以是静态代码块。static的主要作⽤在于创建独⽴于具体对象的域变量或者⽅法。这⾥我们不对static展开累述,只要讲明⽩static变量即可。static变量也称作静态变量,静态变量和⾮静态变量的区别是:静态变量被所有的对象所共享,在内存中只有⼀个副本【存放在⽅法区】,它当且仅当在类初次加载时会被初
始化【加final和不加final的static变量初始化的位置不⼀样】。⽽⾮静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。也就是说,在⼀个线程内,没有被static修饰的ThreadLocal变量实例,会随着所在的类多次创建⽽被多次实例化,虽然ThreadLocal限制了变量的作⽤域,但这样频繁的创建变量实例是没有必要的。
ThreadLocal变量为什么⽤static修饰
答案是,为了避免重复创建TSO(thread specific object,即与线程相关的变量。),我们知道,⼀个ThreadLocal实例对应当前线程中的⼀个TSO实例。因此,如果把ThreadLocal声明为某个类的实例变量(⽽不是静态变量),那么每创建⼀个该类的实例就会导致⼀个新的TSO实例被创建。显然,这些被创建的TSO实例是同⼀个类的实例。于是,同⼀个线程可能会访问到同⼀个TSO(指类)的不同实例,这即便不会导致错误,也会导致浪费(重复创建等同的对象)!因此,⼀般我们将ThreadLocal使⽤static修饰即可。
static修饰的变量
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论