ThreadLocal变量

来源:互联网 发布:查看ip的端口是否打开 编辑:程序博客网 时间:2024/05/21 07:12

TheadLocal线程局部变量:为每一个使用变量的线程都提供一个变量值的副本,每个线程都可以独立地改变自己的副本,而不会和其他线程冲突。

ThreadLocal类有一个protected方法initialValue()和三个public方法get(),set(T),remove(),其他的私有方法暂不讨论,主要看一下3个公有方法的实现原理:

set(T)

    public void set(T value) {        Thread t = Thread.currentThread();        # 每个线程有自己维护的一个Map        ThreadLocalMap map = getMap(t);        # 如果存在就把当前值放入线程的Map中,key为当前ThreadLocal类的实例        if (map != null)            map.set(this, value);        else        # 如果不存在就创建这个Map,然后将ThreadLocal实例作为key            createMap(t, value);    }

T get()

    public T get() {        Thread t = Thread.currentThread();        ThreadLocalMap map = getMap(t);        # 根据当前的ThreadLocal实例获得存入的value值        if (map != null) {            ThreadLocalMap.Entry e = map.getEntry(this);            if (e != null) {                @SuppressWarnings("unchecked")                T result = (T)e.value;                return result;            }        }        # 如果不存在就返回一个初始值        return setInitialValue();    }

remove()

    public void remove() {         # 获得当前线程的Map         ThreadLocalMap m = getMap(Thread.currentThread());         # 根据当前ThreadLocal实例移除Map中的值         if (m != null)             m.remove(this);     }

ThreadLocal(以空间换时间)和线程同步机制(以时间换空间)都是为了解决多线程中相同变量的访问冲突问题。

原创粉丝点击