ThreadLocal和FastThreadLocal对比

本文深入探讨Java中的四种引用类型:强引用、软引用、弱引用和虚引用,及其应用场景,如缓存管理和内存泄漏预防。同时,解析ThreadLocal与FastThreadLocal的工作原理和使用场景,帮助理解线程间数据隔离与共享。

引用的四种类型:

1. 强引用 (strong refrence): new一个对象这种产生的引用就是强引用

2. 软引用(soft refrence):当jvm堆内存不足时,会产生oom错误时,会回收这部分内存,适合做缓存

3. 弱引用(weak refrence):当不存在强引用时,只要发生GC,就会回收这部分内存  试用于跟踪对象的回收,避免内存泄漏

4. 虚引用(phantom refence): 比弱引用更弱的一种引用,通过get方法都拿不到对应的对象 使用场景上感觉和弱引用很像 这里留一个todo 等知道后再来完善

 

ThreadLocal:

1)  基本用法:

public class ThreadLocalTest {
    static ThreadLocalthreadLocal =new ThreadLocal<>();
        public static void main(String[] args) {
            threadLocal.set("hello");
            new Thread(() -> {
                threadLocal.set("world");
                System.out.println(Thread.currentThread().getName() +"->"                   +threadLocal.get());
            }).start();
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() +"->" +threadLocal.get());
    }
}

 

2)作用:可以理解为线程的上下文,保存线程运行时需要的一些信息,这样每个地方都可以用同一份数据,而且不同线程之间相互不影响 要说明的是 一个线程可以使用多个ThreadLocal(threadLocal1、threadLocal2...)

3)原理:每个线程Thread对象里面有一个成员变量ThreadLocal.ThreadLocalMap threadLocals =null; threadLocals默认为空,ThreadLocalMap中有一个Entry数组(每个Entry是一种key-value结构,key是threadLocal对象,值是threadLocal中保存的值),在set值的时候会保存到Entry数组中对应的位置

 

FastThreadLocal

1)每个fastThreadLocal都对应一个编号index

2)如果是普通线程,则每个线程对应InternalThreadLocalMap,里面包含一个indexVariables数组,数组小标对应fastThreadLocal的index(数组默认长度是32)和threadLocal一样 每个线程可以对应多个fastThreadLocal   如果是netty自己封装的FastThreadLocalThread,里面包含一个成员变量InternalThreadLocalMap threadLocalMap 直接从成员变量里面取

 

参考文章:1. https://www.jianshu.com/p/3fc2fbac4bb7

  1. https://www.cnblogs.com/ilellen/p/4135266.html

FastThreadLocal 是 Netty 中的一个优化版 ThreadLocal 实现。 JDK 自带的 ThreadLocal 相比,FastThreadLocal 在性能上有所提升。 FastThreadLocal 的性能优势主要体现在以下几个方面: 1. 线程安全性:FastThreadLocal 使用了一种高效的方式来保证线程安全,避免了使用锁的开销,使得在高并发场景下性能更好。 2. 内存占用:FastThreadLocal 的内部数据结构更加紧凑,占用的内存更少,减少了对堆内存的占用,提高了内存的利用效率。 3. 访问速度:FastThreadLocal 在访问时,使用了直接索引的方式,避免了哈希表查找的开销,使得访问速度更快。 在 Netty 源码中,FastThreadLocal 主要被用于优化线程的局部变量存储,提高线程之间的数据隔离性访问效率。通过使用 FastThreadLocal,Netty 在高性能的网络通信中能够更好地管理线程的局部变量,提供更高的性能并发能力。 引用中提到的代码片段展示了 Netty 中的 InternalThreadLocalMap 的获取方式。如果当前线程是 FastThreadLocalThread 类型的线程,那么就直接调用 fastGet 方法来获取 InternalThreadLocalMap 实例;否则,调用 slowGet 方法来获取。 fastGet 方法中,会先尝试获取线程的 threadLocalMap 属性,如果不存在则创建一个新的 InternalThreadLocalMap,并设置为线程的 threadLocalMap 属性。最后返回获取到的 threadLocalMap。 slowGet 方法中,通过调用 UnpaddedInternalThreadLocalMap.slowThreadLocalMap 的 get 方法来获取 InternalThreadLocalMap 实例。如果获取到的实例为 null,则创建一个新的 InternalThreadLocalMap,并将其设置到 slowThreadLocalMap 中。最后返回获取到的 InternalThreadLocalMap。 综上所述,FastThreadLocal 是 Netty 中为了优化线程局部变量存储而设计的一种高性能的 ThreadLocal 实现。它通过减少锁的开销、优化内存占用加快访问速度来提升性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [FastThreadLocal源码分析](https://blog.youkuaiyun.com/lvlei19911108/article/details/118021402)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Netty 高性能之道 FastThreadLocal 源码分析(快且安全)](https://blog.youkuaiyun.com/weixin_33871366/article/details/94653953)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值