`
鳄鱼旭
  • 浏览: 76086 次
文章分类
社区版块
存档分类
最新评论

弱引用与ThreadLocal的结合

 
阅读更多

一直没看到基于弱引用(java.lang.ref.WeakReference)的合适的例子,直到阅读Lucene-core的代码,发现了这么一段:

 

 

public class CloseableThreadLocal<T> implements Closeable {

  private ThreadLocal<WeakReference<T>> t = new ThreadLocal<WeakReference<T>>();

  // Use a WeakHashMap so that if a Thread exits and is
  // GC'able, its entry may be removed:
  private Map<Thread,T> hardRefs = new WeakHashMap<Thread,T>();
  
  // Increase this to decrease frequency of purging in get:
  private static int PURGE_MULTIPLIER = 20;

  // On each get or set we decrement this; when it hits 0 we
  // purge.  After purge, we set this to
  // PURGE_MULTIPLIER * stillAliveCount.  This keeps
  // amortized cost of purging linear.
  private final AtomicInteger countUntilPurge = new AtomicInteger(PURGE_MULTIPLIER);

  protected T initialValue() {
    return null;
  }
  
  public T get() {
    WeakReference<T> weakRef = t.get();
    if (weakRef == null) {
      T iv = initialValue();
      if (iv != null) {
        set(iv);
        return iv;
      } else {
        return null;
      }
    } else {
      maybePurge();
      return weakRef.get();
    }
  }

... ....

 

这里面用的很好:由于ThreadLocal在使用上并么有数量的限制,需要靠使用者手工删除的方式才能释放对象的引用,因此实际上很容易造成内存泄露,而CloseableThreadLocal使用WeekReference的方式缓存ThreadLocal的数据,很好地解决了这个问题,Perfect!

 

 

分享到:
评论

相关推荐

    threadLocal

    `ThreadLocalMap`使用弱引用作为键,目的是在线程不再引用ThreadLocal对象时,允许垃圾回收器回收该对象,从而避免内存泄漏。然而,如果线程仍然存活并且`ThreadLocalMap`中的值没有被其他引用保持,那么可能会出现...

    ThreadLocal内存泄露分析

    2. **匿名内部类与ThreadLocal的结合**:在匿名内部类中使用ThreadLocal,由于内部类会隐式持有对外部类的引用,如果外部类对象很大,且线程持续存在,那么这个大的外部类对象也无法被垃圾收集,从而引发内存泄露。...

    JAVA面试八股文JAVA面试八股文

    当ThreadLocal变量不再使用时,应当及时调用`remove()`方法,避免弱引用的ThreadLocal对象在无外部引用后无法被GC回收,进而引起内存泄漏。 5. **其他常见面试知识点** - **集合框架**:理解List、Set、Map接口...

    西安电脑技术培训华美校区教授使用的6个Java功能.docx

    西安电脑技术培训华美校区提到的六个Java功能包括反射、字节码操作、ThreadLocal、类加载器、弱引用/软引用以及套接字。以下是这些功能的具体说明及其潜在风险: 1. **反射(Reflection)**:反射允许程序在运行时...

    多线程基础部分.md,学习代码

    然而,如果不正确地使用ThreadLocal,可能会导致内存泄漏,这正是“JUC-ThreadLocal内存泄漏弱引用.png”和“JUC-ThreadLocal内存泄漏强引用.png”所要揭示的问题。 “TimeUnit.md”可能涵盖了Java中的TimeUnit枚举...

    一线大厂Java多线程面试120题.pdf

    19. **ThreadLocalMap的键是弱引用**:ThreadLocalMap的键使用弱引用,当没有其他引用指向ThreadLocal实例时,垃圾收集器可以回收ThreadLocal,从而避免内存泄漏。 20. **防止ThreadLocal内存泄漏**:及时清理不再...

    java面试题目共享

    面试中可能探讨新生代和老年代、Minor GC和Full GC、引用类型(强引用、软引用、弱引用、虚引用)以及内存泄漏的问题。 五、并发编程 Java提供了丰富的并发工具类,如synchronized、volatile、ThreadLocal、...

    阿里2023实习生-客户端笔试题目解析

    面试中可能会涉及到对象生命周期、引用类型(强引用、软引用、弱引用、虚引用)以及GC的工作原理。 再者,对于客户端开发,线程同步与并发控制是常见考点。Java提供了多种线程同步机制,如synchronized关键字、wait...

    Java系统中内存泄漏测试方法的研究

    1. 适当地使用弱引用(WeakReference)、软引用(SoftReference)和虚引用(PhantomReference)。 2. 避免使用静态集合类,尤其是在不需要长期存储数据的情况下。 3. 使用完线程局部变量后及时清理。 4. 及时解除...

    Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)

    1. 使用弱引用(WeakReference)或软引用(SoftReference):这些类型的引用不会阻止对象被垃圾收集,一旦对象只被弱引用或软引用持有,GC就会回收它。 2. 注意生命周期管理:确保在不再需要对象时,解除对其的引用...

    Java基础知识点 - 内容比较全面

    有强引用、软引用、弱引用和虚引用四种类型,分别对应不同的内存管理策略,如垃圾回收时对引用对象的处理。 2. **Java多线程相关知识**:Java通过Thread类和Runnable接口支持多线程编程。线程间通信可以使用wait(),...

    Java方面技术面试题(最新的)

    6. **内存管理**:Java的垃圾收集机制是自动进行的,但理解对象生命周期、内存泄漏、引用类型(强引用、软引用、弱引用、虚引用)等对于优化程序性能至关重要。 7. **JVM**:Java虚拟机是Java运行的基础,面试中...

    java超有用的面试题目

    - **弱引用**:在下一次GC时一定会被回收。 - **虚引用**:主要用于跟踪对象的销毁过程。 #### JUC/并发相关知识点 - **ThreadLocal原理**:每个线程拥有独立的副本,避免了线程间的共享和竞争。 - **Synchronized...

    java经典面试题

    - **弱引用**:更弱一些的引用类型,在下一次垃圾回收时会被回收。 - **虚引用**:无法通过虚引用来获取对象实例,主要用来跟踪对象被垃圾回收的过程。 6. **`hashcode` 的作用**: - `hashcode` 方法返回对象的...

    java面试题-外企软件工程师面试题大全

    5. **内存管理与垃圾回收**:理解Java内存模型(堆、栈、方法区、本地方法栈),垃圾收集机制(GC)的工作原理,包括可达性分析、引用类型(强、弱、软、虚)以及GC算法(标记-清除、复制、标记-整理、分代收集)。...

    Android面试要点

    - **内存优化**:减少不必要的对象创建,使用软引用、弱引用来管理非关键资源。 - **CPU优化**:避免过多的计算密集型操作,合理利用线程池。 - **I/O优化**:使用异步加载技术,如AsyncTask、HandlerThread等。 - *...

    Java_Advanced_journal

    理解对象生命周期、引用类型(强、软、弱、虚引用)以及如何进行性能优化(例如,使用G1、ZGC等现代垃圾收集器)对于写出高效、无内存泄漏的代码至关重要。 3. 泛型:泛型引入了类型参数化,提高了代码的类型安全性...

    java面试题_多线程(68题)

    43. **线程安全的弱引用**:`WeakReference`, `SoftReference`在多线程环境下的应用和注意事项。 44. **线程池的定时任务**:`ScheduledExecutorService`接口,实现定时和周期性任务。 45. **线程池的任务提交**:...

    疯狂JAVA讲义

    6.9.4 对象的软、弱和虚引用 230 6.10 修饰符的适用范围 233 6.11 使用JAR文件 234 6.11.1 jar命令详解 235 6.11.2 创建可执行的JAR包 237 6.11.3 关于JAR包的技巧 238 6.12 本章小结 239 本章练习 239 第7...

    JAVA核心知识点整理(有效)

    引用计数法............................................................................................................................................... 26 2.4.1.2. 可达性分析..........................

Global site tag (gtag.js) - Google Analytics