ThreadLocal精讲

这篇具有很好参考价值的文章主要介绍了ThreadLocal精讲。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
ThreadLocal精讲ThreadLocal精讲

ThreadLocal精讲

一、什么是ThreadLocal?

  • ThreadLocal用来提供线程级别变量,变量只对当前线程见,ThreadLocal通过空间换时间的方案,规避了竞争问题,因为每个线程都有属于自己的变量。
  • TheadLocal为每个使用该变量的线程单独提供独立的变量副本,具有线程隔离效果。
  • 与synchronized的区别
    synchronized 与 TheadLocal都可以实现多线程访问,保证线程安全问题。
    • synchronized 采用当多线程竞争到同一个资源的时候,最终只能够有一个线程访问,采用时间换空间的方式,保证安全问题。
    • TheadLocal 在每个线程中都自己独立的局部变量,空间换时间,相互之间隔离,相比来说TheadLocal效率更高

ThreadLocal精讲

二、源码分析

1. 首先看下Thread类

public class Thread implements Runnable {
   
    /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;
    
  }

Thread中有一个 threadLocals 属性表示线程的本地变量。这个属性的类型是 ThreadLocal.ThreadLocalMap

2. ThreadLocalMap这是什么?

ThreadLocalMapThreadLocal的内部类,他是类 Map结构,并用 Entry封装 K-V。不同的是 ThreadLocalMap的 Entry的 Key只能是 ThreadLocal类型对象,并且是一个弱引用(下面会详细详解)。
ThreadLocal精讲
也就是说线程通过一个类Map数据结构ThreadLocal.ThreadLocalMap来存储属于自己的线程变量。

3. ThreadLocal详解

  • ThreadLocal 先对其进行介绍后进行测试。
  • ThreadLocalMap赋值、取值操作的入口在其外部类 ThreadLocal中。
  • 使用时我们只需要操作ThreadLocal即可。
  1. set(T )方法内调用 ThreadLocalMap 的 set(this,v)方法存值。

ThreadLocal精讲2. get()方法内调用 ThreadLocalMap的 getEntry(this)方法取值

ThreadLocal精讲## 4. 测试

public class TestThreadLocal {

    public static void main(String[] args) {

        ThreadLocal threadLocal = new ThreadLocal();
        threadLocal.set("第一次值");
        threadLocal.set("第二次值");
        System.out.println(threadLocal.get());
       
    }
}

ThreadLocal精讲通过set(T)方法可知存储的是当前TheadLocal对象和值,所以新值会替换旧值

三、什么是弱引用呢?

3.1 谈谈引用关系都有哪些,区别又是什么?

  1. 强引用: 当内存不足时,JVM开始进行GC(垃圾回收),对于强引用对象,就算出现OOM(内存溢出)也不会对该对象进行回收

  2. 软引用: 当系统内存充足时,不会被回收,当系统内存不足时会被回收,内存够用就保留,不够用就回收

  3. 弱引用: 比软引用的生存周期更短,只要垃圾回收,不管JVM的内存空间是否够用,都会回收该对象占用的内存空间。

  4. 虚引用: 形同虚设,虚引用不会决定对象的生命周期(主要配合队列,在销毁前做一些操作)。

3.2 ThreadLocal为何使用弱引用

容易被GC回收,对于ThreadLocal而言,为最小化减少内存泄漏的可能性和影响,在ThreadLocal的get,set方法被调用的时候,都会清除线程map里面所有key为null的值。

3.3 内存泄漏是什么,如何避免TheadLocal的内存泄漏?

内存泄漏: 申请了内存,但是该内存一直无法释放,申请内存时,发现内存不足,就会报错OOM问题

如何避免

  • TheadLocal本身会在get,set时清除key为null的值
  • Entry对象本身为弱引用
  • 在使用完该对象时,手动调用remove方法

四、总结

  • Thread用类似 Map的 ThreadLocal.ThreadLocalMap数据结构来存储以 ThreadLocal类型的变量为 Key的数值,并用 ThreadLocal来存取删,操作 ThreadLocalMap
  • 调用 set(T)方法时,就是以当前ThreadLocal变量为 key,传入参数为 value,向 ThreadLocal.ThreadLocalMap存数据
  • 当我们调用 get()方法时,就是以当前 ThreadLocal变量为 key,从 ThreadLocal.ThreadLocalMap取对应的数据
  • 使用完后记得调用remove()方法

ThreadLocal精讲ThreadLocal精讲文章来源地址https://www.toymoban.com/news/detail-475162.html

到了这里,关于ThreadLocal精讲的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • ThreadLocal的应用及原理

    ThreadLocal的应用及原理

    JDK 对 ThreadLocal 的描述为: 此类提供线程局部变量。这些变量与普通变量的不同之处在于,每个访问一个变量的线程(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些字段希望将状态与线程(例如,用户ID或事务ID)相

    2024年02月06日
    浏览(19)
  • ThreadLocal 详解

    ThreadLocal 详解

    ThreadLocal类用来提供线程内部的局部变量,不同的线程之间不会相互干扰 这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量 在线程的生命周期内起作用,可以减少同一个线程内多个函数或组件之间一些公共变量传递的

    2023年04月08日
    浏览(6)
  • ThreadLocal使用与原理

    ThreadLocal使用与原理

    ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。 ThreadLoal 变量,线程局部变量,同一

    2024年02月11日
    浏览(13)
  • ThreadLocal源码解析

    使用ThreadLocal可以为每个线程维护一个线程变量,使用场景为线程间隔离,线程内方法共享; 原理: Thread类中有一个实例属性ThreadLocalMap,ThreadLocalMap中存放的是Entry数组,Entry数组是ThreadLocal和Object的键值对;源码如下-- Thread类: ThreadLocal-ThreadLocalMap-Entry类: ThreadLocal有一个

    2024年02月12日
    浏览(14)
  • 并发编程09:ThreadLocal

    并发编程09:ThreadLocal

    ThreadLocal中ThreadLocalMap的数据结构和关系 ThreadLocal的key是弱引用,这是为什么? ThreadLocal内存泄漏问题你知道吗? ThreadLocal中最后为什么要加remove方法? ThreadLocal提供线程局部变量。这些变量与正常的变量 不同 ,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法

    2024年02月04日
    浏览(11)
  • ThreadLocal相关知识点

    ThreadLocal是Java中的一个类,它提供了一种线程局部变量的机制。它的作用是,为每个线程创建一个独立的变量副本,各个线程之间互不干扰。简单来说,ThreadLocal为多线程环境下的线程提供了一种线程私有的数据存储方式。 使用ThreadLocal可以避免多线程中的数据共享和竞争条

    2024年02月11日
    浏览(10)
  • ThreadLocal 本地线程变量详解

    ThreadLocal 本地线程变量详解

    ThreadLocal 意为本地线程变量,即该变量只属于当前线程,对其他线程隔离 我们知道,一个普通变量如果被多线程访问会存在存在线程安全问题,这时我们可以使用 Synchronize 来保证该变量某一时刻只能有一个线程访问,从而解决并发安全问题 但如果这个变量并不需要被共享,

    2024年02月05日
    浏览(10)
  • java ThreadLocal

    java ThreadLocal

    上面三行代码分别是定义、赋值和取值。 介绍: 我们只需要实例化对象一次,并且也不需要知道它是被哪个线程实例化。虽然所有的线程都能访问到这个ThreadLocal实例,但是每个线程却只能访问到自己通过调用ThreadLocal的set()方法设置的值。即使是两个不同的线程在同一个T

    2024年02月14日
    浏览(10)
  • Java——》ThreadLocal

    Java——》ThreadLocal

    推荐链接:     总结——》【Java】     总结——》【Mysql】     总结——》【Redis】     总结——》【Kafka】     总结——》【Spring】     总结——》【SpringBoot】     总结——》【MyBatis、MyBatis-Plus】     总结——》【Linux】     总结——》【MongoDB】    

    2024年02月09日
    浏览(9)
  • ThreadLocal八股文

    ThreadLocal八股文

    目录 1. 为什么要⽤ ThreadLocal? 2. ThreadLocal 的原理是什么? 3. 为什么⽤ ThreadLocal 做 key? 4. Entry 的 key 为什么设计成弱引⽤? 5. ThreadLocal 真的会导致内存泄露? 6. 如何解决内存泄露问题? 7. ThreadLocal 是如何定位数据的? 8. ThreadLocal 是如何扩容的? 9. ⽗⼦线程如何共享数据?

    2024年02月05日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包