android ThreadLocal使用以及作用

理解Android ThreadLocal:作用与使用示例
ThreadLocal在Android开发中扮演重要角色,尤其在理解Handler源码时。它用于线程本地存储,确保各线程拥有独立的数据副本,而非解决线程安全问题。ThreadLocal操作包括set()和get(),前者设置值,后者获取,未设置时get()返回null。其实现原理是内部维护一个Map,Key为Thread,Value为set()的值,在Handler中,这个Value通常是Looper。

如果想看懂Android中Handler源码,那么ThreadLocal类的作用必须要懂,ThreadLocal的出现解决了线程存存储自己的数据不发生异常,而不是解决线程安全问题,看下例子:

package thread;

public class ThreadLocalTest {
    static ThreadLocal<String> threadLocal = new ThreadLocal<>();
    public static void main(String[] args) {
        new Thread(){
            @Override
            public void run() {
                threadLocal.set("第一个线程");
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"-----"+threadLocal.get());
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                threadLocal.set("第二个线程");
                try {
                    sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"-----"+threadLocal.get());

            }
        }.start();
        threadLocal.set("main线程");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"-----"+threadLocal.get());
    }
}

ThreadLocal使用很简单,就是一个set()  get()方法 一个设置值  一个获取值,如果不调用set()方法设置值的话 get()的值为null,

除非你重写它的方法

 protected T initialValue() {
        return null;
    }

我们可以理解它内部是一个map去维护,key是Thread,value是你通过set()方法的值,在Handler源码中value是Looper.

 

Android 中,ThreadLocal 是一种重要的工具,以下从使用方法、原理和应用场景三方面进行介绍。 ### 使用方法 从代码层面看,ThreadLocal使用涉及到 `set()`、`get()` 等方法。以 `set()` 方法为例,其代码如下: ```java public void set(T value) { // 获取当前线程 Thread t = Thread.currentThread(); // 获取当前线程对应的存储(ThreadLocalMap) // 关键一:getMap() 返回值为 ThreadLocalMap ThreadLocalMap map = getMap(t); // map 存储不为空 if (map != null) // 关键二:ThreadLocalMap#set() // key 为当前线程的 ThreadLocal map.set(this, value); else // map 存储为空 // 创建 ThreadLocalMap createMap(t, value); } ``` 在外部调用时,通常是 `ThreadLocal.set(value)` 方法,但本质上调用的是线程中的 ThreadLocalMap 中的 `set(key, value)` 方法 [^3][^4]。 ### 原理 ThreadLocal 是 Java 提供的一个线程局部存储机制,它通过每个线程独立的变量副本避免了线程之间的数据竞争。其底层是通过 ThreadLocalMap 实现的,ThreadLocal 为每个线程提供了独立的存储空间,减少了锁竞争,提高了并发性能 [^2]。整个 ThreadLocal使用都涉及到线程中的 ThreadLocalMap,每个线程都有自己的 ThreadLocalMap,当调用 `ThreadLocal.set(value)` 时,会在当前线程的 ThreadLocalMap 中以该 ThreadLocal 实例为 key,存储相应的 value [^3]。 ### 应用场景 ThreadLocal 使用的场景大致分为解决线程并发的线程安全问题和某些特定场景的问题。它本身能够被多个线程共享使用,并且又能够达到线程安全的目的。常见的应用场景包括数据库连接管理、线程池中的线程独立数据以及线程安全的日志处理等 [^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值