ThreadLocal

2018-07-23  本文已影响7人  金馆长说

ThreadLocal是一个作用于线程中数据存储类,主要功能是保存的值只有创建线程才能访问,其他线程无法访问其他线程中的值。

 final ThreadLocal t = new ThreadLocal();
        new Thread(new Runnable() {
            @Override
            public void run() {
                t.set(234);
                System.out.println(t.get());
            }
        },"threadA").start();

234

new Thread(new Runnable() {
            @Override
            public void run() {
                t.set(2345);
                System.out.println(t.get());
            }
        },"threadB").start();

2345

同一线程多次set()会把之前的值覆盖

实现原理

获取当前线程的ThreadLocalmap里的Entry[]它是一个弱引用的子类,不同线程就持有不同的ThreadLoalmap。这样不同线程就是不同的map,实现了独立线程的保存和获取。

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

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();
    }
上一篇 下一篇

猜你喜欢

热点阅读