美文网首页
并发编程----ThreadLocal

并发编程----ThreadLocal

作者: 雪君妹子 | 来源:发表于2018-05-15 20:13 被阅读0次

一、ThreadLocal

1、作用:使用ThreadLocal来做线程级的缓存,因为各个线程使用ThreadLocal中的数据是互不影响的,不存在数据安全的问题。

2、初始化步骤

1)在ThreadLocalMap中定位到ThreadLocal为key的entry项;

2)  如果存在entry项,同时存在key,则直接用新的value替换掉旧的value;

3)如果存在entry项,同时key为空,那么就恢复key的值和重新设置value;

4)如果不存在entry,则创建一个新的entry项。

需要说明的是,在进行set操作时,当ThreadLocal被设置为null时,ThreadLocalMap就会移除key为ThreadLocal的Entry(因为Entry本身就是一个弱引用对象)。

3、ThreadLocal内存泄漏的原因

 可以看出,ThreadLocalMap中的key是弱引用类型。Java进行垃圾回收时,会一直回收掉弱引用类型的对象。在代码实例中,key即ThreadLocal对象是弱引用类型,当没有强引用指向ThreadLocal对象时,gc会回收掉Entry中的key,即回收ThreadLocal对象本身。而value不会被回收掉的,因为value是强引用。Entry对象是位于ThreadLocal对象内的,既然ThreadLocal对象已经被回收掉了,entry就成了一个引用不可达的对象,gc无法回收,所以会出现内存泄露。

为了避免这个问题,可以先调用ThreadLocal的remove的方法,以便清除掉不需要的value。

参考深入分析ThreadLocal内存泄漏

4、使用场景

NamedThreadLocal:RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder、SimpleDateFormat等的共享应用

相关文章

  • Synchronized与Lock的区别

    其他:并发编程之ThreadLocal、Volatile、Synchronized、Atomic关键字Java并发...

  • 并发编程----ThreadLocal

    一、ThreadLocal 1、作用:使用ThreadLocal来做线程级的缓存,因为各个线程使用ThreadLo...

  • 并发编程-Threadlocal

    上一篇 <<

  • 并发编程 ThreadLocal

    概述 1个对象被多个线程同时引用且操作(比如作为线程的成员变量),会引发线程安全的问题。但是可以通过给该对象设置T...

  • Java线程相关类

    A.ThreadLocal类(泛型支持)-代表线程局部变量 使用ThreadLocal类可以简化多线程编程时的并发...

  • ThreadLocal

    一、ThreadLocal简介 ThreadLocal是在并发编程的多线程环境下用来保证变量线程安全的工具类,其基...

  • Java并发编程 ThreadLocal

    1.ThreadLocal的用途 场景1:每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有Simple...

  • Java并发编程:ThreadLocal

    我之前的一篇博客https://www.jianshu.com/p/423544285f84,介绍了Android...

  • Java并发编程 - ThreadLocal

    ThreadLocal是什么 简单的翻译一下就是 ThreadLocal提供了线程的局部变量,每个线程都可以通过s...

  • Java并发编程-ThreadLocal

    1.注意事项 使用ThreadLocaL时要注意:为每个线程分配一个对象的工作并不是由ThreadLocal来完成...

网友评论

      本文标题:并发编程----ThreadLocal

      本文链接:https://www.haomeiwen.com/subject/vkiydftx.html