package com.neutron.t19;
import java.util.concurrent.TimeUnit;
/**
* ThreadLocal线程局部变量
*
* ThreadLocal是使用空间换时间,synchronized是使用时间换空间
* 比如hibernate中session就存在ThreadLocal中,避免synchronized的使用
*/
public class T192 {
static ThreadLocal<Car> tl = new ThreadLocal<>();
/**
* 按理来说应该是i2线程拿到的数据应该是t1线程保存进去的数据,因此i2应该打印出来bmw一类的数据
* 但是实际结果并非如此,结果是null。
* 解释:
* ThreadLocal只对当前线程有用,其key值是当前线程。我们查看其set方法
* public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
因此我们能知晓不同的线程,使用的是不同的key,而不是相同的key
如果在线程中使用ThreadLocal相当于在每个线程中使用自己单独的变量,相互之间没有影响和冲突
*/
public static void main(String[] args) {
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(tl.get());
}, "i2").start();
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
tl.set(new Car());
}, "t1").start();
}
}
class Car {
String name = "bmw";
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
'}';
}
}