Java~ThreadLocal类

11 篇文章 0 订阅
3 篇文章 0 订阅

目录

ThreadLocal类

ThreadLocal和synchronized 

 ThreadLocal应用场景

 ThreadLocal实现原理


ThreadLocal类

ThreadLocal叫做线程变量,ThreadLocal提供了线程内存储变量的能力,这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值。

ThreadLocal是除了加锁这种同步方式之外的另一种保证多线程访问变量时的线程安全的方法;如果每个线程对变量的访问都是基于线程自己的变量这样就不会存在线程不安全问题 

ThreadLocal和synchronized 

ThreadLocal<T>`其实是与线程绑定的一个变量。

ThreadLocal和Synchonized都用于解决多线程并发访问。

但是ThreadLocal与synchronized有本质的区别:

- synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离

- synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享

- 对于多线程资源共享的问题,同步机制采用了以时间换空间的方式,而ThreadLocal采用了以空间换时间的方式。
前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

 ThreadLocal应用场景

每个线程需要有自己单独的实例

实例需要在多个方法中共享,但不希望被多线程共享

 ThreadLocal实现原理

早期版本的ThreadLocal可以理解为一个Map。当工作线程Thread实例向本地变量保持某个值时,
会以key-value形式保存在ThreadLocal内部的Map中,其中Key为线程Thread实例,Value为待保
存的值。当工作线程Thread实例从ThreadLocal本地变量取值时,会以Thread实例为Key,获取其
绑定的Value。
JDK1.8每个线程拥有一个ThreadLocalMap,ThreadLocalMap中元素Entry由key-value对组成,
key为ThreadLocal对象,value为Object类型的值。Entry继承自WeakReference,并且在Entry
构造函数中,key也就是ThreadLocal被设置为弱引用,弱引用在垃圾回收时会被回收

- 每个Thread线程内部都有一个Map,即ThreadLocalMap
- Map里面存储ThreadLocal对象key和线程的变量副本value
- Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值
- 对于不同的线程,每次获取副本值时,别的线程不能获取到当前线程的副本值,形成了副本的隔离

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值