[Java]-弱引用WeakReference与ThreadLocal

本文介绍了Java中的弱引用和ThreadLocal,展示了如何使用它们处理对象生命周期管理和多线程安全问题。重点讲解了弱引用在垃圾回收中的角色,以及ThreadLocal如何存储线程私有数据,避免并发冲突。


WeakReference (弱引用) 的强度比软引用更弱一些,会被垃圾收集器(GC)回收掉。

WeakReference

Java中,对象在堆上创建;当GC运行时,会回收掉没有任何引用的对象。

定义

当一个对象仅仅被弱引用指向, 而没有其他强引用指向的时候,GC运行时会把这个对象回收掉。weak reference的语法是:

WeakReference<T> wrEle = new WeakReference<T>();

获取

要获得弱引用指向的对象时, 首先需要判断它是否已经被GC回收,若被收回,则下列返回值为空:

ele = wrEle.get();
if(ele==null){
   
   
    // 已被回收掉
}

WeakHashMap

WeakHashMap是一个散列表,实现了Map接口,其存储的键和值都可以是null;但WeakHashMap的键是**“弱键”**(当其不再被正常使用时,会被从WeakHashMap中被自动移除)。

通过ReferenceQueue<Object> queue注册记录被回收的键值,然后在操作散列表时通过expungeStaleEntries来移除散列表中对应的键值。

ThreadLocal

多线程访问同一个共享变量时容易出现并发问题(特别是修改变量时),为保证线程安全就需要额外的同步措施。ThreadLocal是除加锁之外的一种规避多线程访问问题的方法,通过ThreadLocal可以使线程只访问线程本地变量。

简介

ThreadLocal有些像HashMap,保存的是键值对(通过set设定,通过get获取):其键是ThreadLocal对象,设定的源码:

    public void set(T value) {
   
   
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值