简谈Thread Local工作原理

本文介绍了ThreadLocal的工作原理及其在Android开发中的应用。ThreadLocal是一个线程内部的数据存储类,每个线程拥有独立的数据副本,互不影响。文章还探讨了ThreadLocal在Handler获取Looper等典型场景中的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简谈Thread Local工作原理

  • 什么是Thread Local?

    • Thread Local 是一个线程内部的数据存储类,每一个线程都维护一个table[],通过set(),get()方法实现存取操作。

    • 只能在指定的线程中获取存储的数据,其他的线程一般无法获取。(注意:这里我用的是一般,可以使用InheritableThreadLocal达到其他线程获取数据的)

  • 什么情况下使用Thread Local呢?

    • 一般来说,当某些数据以线程为作用域并且不同线程具有不同的数据副本时,就考虑用它了

    • 典型的例子是:Handler要获取当前线程的Looper,Looper的作用域为线程,每个线程具有不同的Looper.

Thread Local的使用方法

   private void testThreadLocal() {
    new Thread(new Runnable() {
        //创建ThreadLocal 对象,支持泛型
        ThreadLocal<String> mLocal = new ThreadLocal<String>();
        @Override
        public void run() {
            mLocal.set("Fan Bin Bin is nice!");
            String s = mLocal.get();
            Log.i("TAG", s);
        }
    }).start();
}

打印结果:
threadlocaltest I/TAG: Fan Bin Bin is nice!

有一个特殊的例子可以实现不同线程的访问存储变量

  private void testThreadLocal() {
    final ThreadLocal<String> local = new InheritableThreadLocal<>();
    local.set("I love China");
    new Thread(new Runnable() {
        @Override
        public void run() {
            Log.i("TAG", local.get() + "");
        }
    }).start();
}

打印结果:

com.yutianwang.threadlocaltest I/TAG: I love China

这里在主线程中创建了InheritableThreadLocal对象,居然在子线程中能够打印出这句话,实现原理大致是:当子线程创建的时候,主线程会将InheritableThreadLocal对象传递给子线程中去,所以能够打印这句话。

这里写图片描述

LocalValues内部有个数组:private Object[] table,Thread local的值就存储在这个table数组中
这里写图片描述

取出当前线程LocalValues对象,如果为null,返回初始值,如果不为空,从table数组中取出Thread Local值

总结

Thread Local所做的读写操作仅限于各自线程的内部,所以在多个线程中互补干扰的存储和修改数据。

声明

此文是建立在《Android开发艺术探索》和

http://droidyue.com/blog/2016/03/13/learning-threadlocal-in-java/
这篇文章基础上的读书笔记。(PS:准大三狗真是累!hh)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值