ThreadLocal学习(三)

ThreadLocal学习(三)

上一篇我们说了ThreadLocal的源码,那么肯定有人发出疑问:ThreadLocalMap是什么东西,那么这次就详细说一下ThreadLocalMap。

  • 基本结构
    ThreadLocalMap是ThreadLocal的内部类,没有实现Map接口,用独立的方式实现了Map功能,内部的Entry也是独立实现

在这里插入图片描述

  • 成员变量
    /**
     * 初始变量 -- 必须是2的整次幂
     */
    private static final int INITIAL_CAPACITY = 16;

    /**
     * 存放数据的table,Entry类的定义在下面分析
     * 同样,数组长度必须是2的整次幂
     */
    private Entry[] table;

    /**
     * 数组里面entrys的个数,可以用于判断table当前使用量是有超过阈值
     */
    private int size = 0;

    /**
     * 进行扩容的阈值,表使用量大于它的时候进行扩容
     */
    private int threshold;
  • 存储结构
/**
     * Entry继承WeakReference,并且用ThreadLocal作为key
     * 如果key为null(entry.get() == null),意味着key不再被引用
     * 因此这时候entry也可以从table中删除
     */
    static class Entry extends WeakReference<ThreadLocal<?>> {
        /** The value associated with this ThreadLocal. */
        Object value;

        Entry(ThreadLocal<?> k, Object v) {
            super(k);
            value = v;
        }
    }

在ThreadLocalMap中,也是用Entry来保存K-V结构数据的。不过Entry中的key只能是ThreadLocal对象,这点在构造方法中已经限定死了。

另外,Entry继承WeakReference,也就是key(ThreadLocal)是弱引用,目的是将ThreadLocal对象的生命周期和线程生命周期解绑。

以上就是ThreadLocalMap的全部知识了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值