今天呢,和大家聊一下ThreadLocal

1. 是什么?

JDK1.2提供的的一个线程绑定变量的类。

他的思想就是:给每一个使用到这个资源的线程都克隆一份,实现了不同线程使用不同的资源,且该资源之间相互独立

2. 为什么用?

思考一个场景:数据库连接的时候,我们会创建一个Connection连接,让不同的线程使用。这个时候就会出现多个线程争抢同一个资源的情况。

这种多个线程争抢同一个资源的情况,很常见,我们常用的解决办法也就两种:空间换时间,时间换空间

没有办法,鱼与熊掌不可兼得也。就如我们的CAP理论,也是牺牲其中一项,保证其他两项。

而针对上面的场景我们的解决办法如下:

  • 空间换时间:为每一个线程创建一个连接。
    • 直接在线程工作中,创建一个连接。(重复代码太多)
    • 使用ThreadLocal,为每一个线程绑定一个连接。
  • 时间换空间:对当前资源加锁,每一次仅仅存在一个线程可以使用这个连接。

通过ThreadLocal为每一个线程绑定一个指定类型的变量,相当于线程私有化

3. 怎么用?

ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.get();
threadLocal.set(1);
threadLocal.remove();

没错,这四行代码已经把ThreadLocal的使用方法表现得明明白白。

  • getThreadLocal拿出一个当前线程所拥有得对象
  • set给当前线程绑定一个对象
  • remove将当前线程绑定的当前对象移除

记住在使用的以后,一定要remove,一定要remove,一定要remove

为什么要remove。相信不少小伙伴听到过ThreadLocal会导致内存泄漏问题。

没错,所以为了解决这种情况,所以你懂吧,用完就移除,别浪费空间(渣男欣慰)

看到这,脑袋上有好多问号出现了(小朋友你是否有很多问号?

为啥会引发内存泄漏?

为啥不remove就内存泄漏了

它是怎么讲对象和线程绑定的

为啥get的时候拿到的就是当前线程的而不是其他线程的

它怎么实现的???

来吧,开淦,源码来

4. 源码解读

先来说一个思路:如果我们自己写一个ThreadLocal会咋写?

线程绑定一个对象。这难道不是我们熟知的map映射?有了Map我们就可以以线程为Key,对象为value添加到一个集合中,然后各种get,set,remove操作,想怎么玩就怎么玩,搞定。

版权声明:本文为onlyzuo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/onlyzuo/p/13932892.html