ThreadLocal是一个作用于线程中数据存储类,主要功能是保存的值只有创建线程才能访问,其他线程无法访问其他线程中的值。
- threadA存入234
final ThreadLocal t = new ThreadLocal();
new Thread(new Runnable() {
@Override
public void run() {
t.set(234);
System.out.println(t.get());
}
},"threadA").start();
234
- threadB存入2345
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();
}
网友评论