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);
}