Threadlocal 概念:
线程局部类型,是一种多线程间并发访问变量的解决方案。与其 synchronized 等加锁的方式不同, ThreadLocal 完全不提供锁,而使用以空间换时间的 手段,为每个线程提供变量的独立副本,以保障线程安全。
从性能上说, ThreadLocal 不具有绝对的优势,在并发不是很高的时候,加锁的性能 会更好,但作为一套与锁完全无关的线程安全解决方案,在高并发量或者竞争激烈的场景, 使用 ThreadLocal 可以在一定程度上减少锁竞争。
代码1:
封装了线程局部类型 th 变量,每一个线程会创建这个变量的副本,各有各的副本
package com.bjsxt.chapter10;
/**
* @author whl
* @date 2021/2/20
*/
public class ThreadLocalDemo {
// 一个ThreadLocal变量
private static ThreadLocal<Object> th = new ThreadLocal<>();
// 获取ThreadLocal变量的值
public Object getTh(){
return th.get();
}
// 设置ThreadLocal变量的值
public void setTh(Object o){
th.set((String)o);
}
}
代码2:
模拟调用者使用这个类
package com.bjsxt.chapter10;
import java.util.concurrent.TimeUnit;
/**
* @author wmr
* @date 2021/2/20
*/
public class Demo {
public static void main(String[] args) {
ThreadLocalDemo tld = new ThreadLocalDemo();
Thread t1 = new Thread(() -> {
tld.setTh("one");
System.out.println(tld.getTh());
});
Thread t2 = new Thread(() -> {
tld.setTh("nine");
System.out.println(tld.getTh());
});
t1.start();
try{
// 使得t1一定执行
TimeUnit.SECONDS.sleep(1);
}catch (InterruptedException e){
e.printStackTrace();
}
t2.start();
}
}
运行结果:
显示信息 one,这个是线程t1拥有的局部变量的值。nine这个是线程t2拥有的局部变量的值,他们各用各的,各不相关。