关于java:ThreadLocal保证线程安全通过源码进行分析

60次阅读

共计 1121 个字符,预计需要花费 3 分钟才能阅读完成。

首先咱们先来看一下 ThreadLocal 的四个办法

1.void set(T value)

public void set(T value) {Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
     if (map != null)
        map.set(this, value);
      else createMap(t, value);
}

从下面能够看出 set 办法中有一个 T value 参数,Thread.currentThread()是一个 native 的本地办法,返回对以后正在执行的线程对象的援用,有趣味的能够自行理解

ThreadLocalMap getMap(Thread t) {return t.threadLocals;}

这里的 getMap(t)返回的是 ThreadLocalMap 类型

这里借用一下大佬的图
ThreadLocal 类的作用是为变量在每个线程中的都创立了正本,每个线程能够拜访本人外部的正本变量,线程之间互不影响。
接着咱们来看 ThreadLocalMap

static class ThreadLocalMap{...}

这是 ThreadLocal 中保护的一个 static 类,次要作用是
将线程变量和其正本关联(映射)起来,同时断绝了其余 ThreadLocal 的拜访,至此咱们可能发现最下面的 set 办法 就是设置以后线程的线程局部变量的值。

2.T get()

public T get() {Thread t = Thread.currentThread();
 ThreadLocalMap map = getMap(t);
 if (map != null) {ThreadLocalMap.Entry e = map.getEntry(this);
 if (e != null) {@SuppressWarnings("unchecked")
            T result = (T)e.value;
 return result;
 }
    }
    return setInitialValue();}

返回线程所对应的线程局部变量的值
3.public void remove()

public void remove() {ThreadLocalMap m = getMap(Thread.currentThread());
     if (m != null)
        m.remove(this);
}

为了缩小内存的应用,将以后线程局部变量进行删除, 线程完结后会主动被垃圾回收。
4.protected T initialValue()

protected T initialValue() {return null;}

这个办法提早调用,线程第一次调用 get()或者 set(T value)才执行。

参考博文 https://www.cnblogs.com/yinbi…

正文完
 0