ThreadLocal学习笔记
概述介绍
ThreadLocal
是用来操作 Thread
中的 threadLocals
(threadLocals
是ThreadLocal
的内部类)
每个线程独占一个 threadLocals
每个线程可以有多个 ThreadLocal
Thread中的threadLocals
是一个Map,以ThreadLocal
作为Key来访问。
每个ThreadLocal
只对应一个值,相当于直接从map中将值取出来。
Demo
每一个对于ThreadLocal
中的数据是独享的,起到了数据隔离的作用。synchronized
是线程隔离。
代码
public class Demo {
public ThreadLocal<String> local = new ThreadLocal();
public void set(String s){
local.set(s);
}
public String get(){
return local.get();
}
public static void main(String[] args) {
Demo demo = new Demo();
for (int i = 0; i < 5; i++) {
int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
demo.set("第"+ finalI +"个");
System.out.println(demo.get());
}
}).start();
}
}
}
输出
五个 public 方法
返回值类型 | 方法 |
---|---|
T |
get() 返回当前线程的此线程局部变量的副本中的值。 |
protected T |
initialValue() 返回此线程局部变量的当前线程的“初始值”。 |
void |
remove() 删除此线程局部变量的当前线程的值。 |
void |
set(T value) 将当前线程的此线程局部变量的副本设置为指定的值。 |
static ThreadLocal |
withInitial(Supplier supplier) 创建线程局部变量。 |
public T get() {
// 获取当前的线程
Thread t = Thread.currentThread();
// 获得当前线程的threadLocals
ThreadLocalMap map = getMap(t);
// 当map为空的时候创建一个
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
// get的时候判断一下是否为空,
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
// 当get前没有set的时候调用此方法,返回initialValue的值默认是null
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
return value;
}
// 可以通过重写这个方法来实现设置默认值的效果
protected T initialValue() {
return null;
}
set
set 的时候先从当前线程中取出 ThreadLocalMa
用自己即ThreadLocal
作为key
来寻找值,当不存在的时候调用createMap
来创建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);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果