import java.util.concurrent.TimeUnit;
/**
* 测试ThreadLocal
* @author
* @since
*/
public class ThreadLocalTest {
private static ThreadLocal<StudentA> studentALocal = new ThreadLocal<>();
private static ThreadLocal<String> stringLocal = new ThreadLocal<>();
public static void main(String[] args) throws InterruptedException {
StudentA studentA = new StudentA();
studentA.setName("小明");
String string = "aaa";
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
studentALocal.set(studentA);
stringLocal.set(string);
System.out.println(studentALocal.get().toString());
System.out.println(stringLocal.get().toString());
studentALocal.get().setName("小红");
String string = stringLocal.get();
string = "bbb";
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(studentALocal.get());
System.out.println(stringLocal.get());
System.out.println(studentA);
System.out.println(string);
}
});
thread1.start();
TimeUnit.SECONDS.sleep(2);
thread2.start();
TimeUnit.SECONDS.sleep(33);
}
}
测试结果:
StudentA [name=小明]
aaa
null
null
StudentA [name=小红]
aaa
结论:ThreadLocal不是深拷贝,只是每一个线程将同一个变量保存在每个线程自有的ThreadLocalMap中,
如果通过ThreadLocal的get方法是取不到不同线程变量值的,除非你在此线程中用ThreadLocal的set()方法放入同一个变量,这样的话两个线程其实通过get方法取出来的是同一个变量。因为不是真正的深度拷贝,所以线程池中每次要调用ThreadLocal的remove方法去除以ThreadLocal为key,变量为value的值。