ThreadLocal

概念理解

​ ThreadLocal为变量在每个线程中都创建了一个副本,使得每个线程可以访问独属于自己的副本变量
​ 即:可以在不同的线程中互不干扰地存储并提供数据,通过统一的代码轻松获取每个线程的副本值。


关键方法

get()

获取ThreadLocal在当前线程中保存的变量副本。(实际上获取当前线程的ThreadLocalMap对象)

set(T value)

设置当前线程中变量的副本

remove()

移除当前线程中变量的副本

initialValue()

用于方法重写 来设置初始值,否则默认初始值为null,如果不重写该方法那么调用get方法前需要调用set方法。


问题思索

为什么不采用同步的方式实现共享变量?

​ 使用共享变量是为了实现线程间通信,共享变量时独一份的,每个线程对它的修改都可能会影响其它线程的执行结果,即一个线程需要关心其它线程是否对这个变量进行了修改。同时这种方式会大大影响程序的执行效率。
​ 假设一个对象有一个变量值,该变量值在不同的线程中有不同的值,副本值互不关联,独立使用。这时候可以考虑使用ThreadLocal .

ThreadLocal是如何为每个线程创建一个副本变量的?

​ 每个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,用于存储实际的变量副本,键值为当前ThreadLocal变量,value为变量副本.下面是ThreadLocal#get方法源码。

 public T get() {
        Thread t = Thread.currentThread();        //获取当前线程的ThreadLocalMap成员变量
        ThreadLocalMap map = getMap(t);           //键值对  ->  
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();               //setInitialValue()方法默认返回null
    }

你可能感兴趣的:(android,java,线程,threadlocal,android,java,线程)