ThreadLocal是线程局部变量,是一种多线程并发访问变量的解决方案,与synchronized加锁方式不同,他完全不提供锁头,提倡以空间换时间的方式,为每个线程提供独立的副本,以保障线程安全。
在并发量不是很高的时候,synchronized加锁的方式可能会更好,但当处于高并发或者锁竞争很激烈的场景时,使用ThreadLocal可以在一定程度上减少锁竞争。
下面是验证ThreadLocal的小例子:
package com.lydon.thread;
import java.util.*;
public class ConnThreadLocal {
private static ThreadLocal<String> th=new ThreadLocal<String>();
private void setTh(String value){
th.set(value);
}
private void getTh(){
System.out.println(Thread.currentThread().getName()+"获取到的值为"+th.get());
}
public static void main(String[] args) {
ConnThreadLocal connThreadLocal=new ConnThreadLocal();
new Thread(()->{
connThreadLocal.setTh("aa");
connThreadLocal.getTh();
}).start();
new Thread(()->{
connThreadLocal.getTh();
}).start();
}
}
输出:
Thread-0获取到的值为aa
Thread-1获取到的值为null
Process finished with exit code 0
由此可以看出ThreadLocal修饰的变量的值分为了两份。