ThreadLocal 应用场景

1.ThreadLocal 是一个存储对象,它可分为static全局变量,局部变量,下面介绍的是全局变量。

当一个多线程读写时就会出现并发的现象,也就当对象共享时会出现的场景。在网上查看了一下别的网友的介绍。

public class ThreadLocalTest {
	private static ThreadLocal<String> nameInfo = new ThreadLocal<>();
    private static ThreadLocal<Integer> ageInfo = new ThreadLocal<>();

    public static void setInfo(String name, Integer age) {
        nameInfo.set(name);
        ageInfo.set(age);
    }

    public static String getName() {
        return nameInfo.get();
    }

    public static void main(String[] args) {
        new Thread(() -> {
        	ThreadLocalTest.setInfo("张三", 10);
            // 张三
            System.out.println(ThreadLocalTest.getName());
        }, "thread1").start();
        new Thread(() -> {
        	ThreadLocalTest.setInfo("李四", 20);
            // 李四
            System.out.println(ThreadLocalTest.getName());
        }, "thread2").start();
        
        nameInfo.remove();
        ageInfo.remove();
    }
}

变量接口如下图

源码分析:

ThreadLocalMap是一个Map,key是ThreadLocal,value是Object

映射到源码就是如下所示: ThreadLocalMap是ThreadLocal的一个静态内部类

public class Thread implements Runnable {
    ThreadLocal.ThreadLocalMap threadLocals = null;
}

往ThreadLocalMap里面放值

// ThreadLocal类里面的方法,将源码整合了一下
public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = t.threadLocals;
    if (map != null)
        map.set(this, value);
    else
        t.threadLocals = new ThreadLocalMap(this, firstValue);
}

从ThreadLocalMap里面取值

// ThreadLocal类里面的方法,将源码整合了一下
public T get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = t.threadLocals;
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    return setInitialValue();
}

从ThreadLocalMap里面删除值

// ThreadLocal类里面的方法,将源码整合了一下
public void remove() {
    ThreadLocalMap m = Thread.currentThread().threadLocals;
    if (m != null)
        m.remove(this);
}

猜你喜欢

转载自blog.csdn.net/qq501569325/article/details/107690763