Java并发编程读书笔记——ThreadLocal

1. ThreadLocal定义:线程变量,是一个以ThreadLocal对象为键,任意对象为值得存储结构。

2. 作用:提供线程内得局部变量,在线程的生命周期内起作用,在本线程内随时可取,隔离其它的线程。

下面写了一个简单的例子:

/**
 * 是一个以ThreadLocal对象为键,任意对象为值得存储结构;
 * 一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上得一个值
 */
public class Profiler {

    private static ThreadLocal<Long> TIME_THREADLOCAL = new ThreadLocal<Long>(){
        //设定初始值
        @Override
        protected Long initialValue() {
            return System.currentTimeMillis();
        }
    };

    //为ThreadLocal设置指定的值
    public static final void begin(){
        TIME_THREADLOCAL.set(System.currentTimeMillis());   //set()  设置ThreadLocal中的值
    }

    public  static final Long end(){
        return System.currentTimeMillis() - TIME_THREADLOCAL.get(); //get()获取ThreadLocal中的值
    }

    public static void main(String[] args) throws InterruptedException {
        Profiler.begin();
        TimeUnit.SECONDS.sleep(1);
        System.out.println("Cost: "+Profiler.end()+" mills");
    }
}

这段代码,首先设置一个当前系统时间为初始值,使线程睡眠一秒,调用end()方法,查看begin()和end()方法所运行的时间,输出结果为:


通过上面,对ThreadLocal有了一定的了解。

3. ThreadLocal中方法:

        get():获取ThreadLocal上绑定的值;

        set():为ThreadLocal设定值;

        remove():将当前线程的ThreadLocal绑定的值删除。

4. ThreadLocal的实现:(JDK1.8ThreadLocal源码)

        下面看一下get()方法的源码:

/**
     * Returns the value in the current thread's copy of this
     * thread-local variable.  If the variable has no value for the
     * current thread, it is first initialized to the value returned
     * by an invocation of the {@link #initialValue} method.
     *
     * @return the current thread's value of this thread-local
     */
    public T get() {
        Thread t = Thread.currentThread();    //获取当前线程
        ThreadLocalMap map = getMap(t);        //根据当前线程获取一个map,看后面getMap()源码
        if (map != null) {        
            ThreadLocalMap.Entry e = map.getEntry(this);    //如果map不为空
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;        //返回map中的value
            }
        }
        return setInitialValue();    //如果map为空,设置初始值
    }
    getMap()的源码:
/**
     * Get the map associated with a ThreadLocal. Overridden in
     * InheritableThreadLocal.
     *
     * @param  t the current thread
     * @return the map
     */
    ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;    //返回一个ThreadLocalMap对象
    }

setInitialValue函数的源码:

/**
     * Variant of set() to establish initialValue. Used instead
     * of set() in case user has overridden the set() method.
     *
     * @return the initial value
     */
    private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }

createMap函数的源码:

/**
     * Create the map associated with a ThreadLocal. Overridden in
     * InheritableThreadLocal.
     *
     * @param t the current thread
     * @param firstValue value for the initial entry of the map
     */
    void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

通过上面对get()方法的源码的简单分析,总结出:

        每个Thread维护一个ThreadLocalMap映射表,这个映射表的key是ThreadLocal实例本身,value是真正需要存储的Object。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值