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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值