代码
@Test
public void shouldAnswerWithTrue() throws InterruptedException {
ThreadLocal<Integer> tl = ThreadLocal.withInitial(() -> 10);
System.out.println(Thread.currentThread().getName() + ":" + tl.get());
Thread t1 = new Thread(() -> {
tl.set(tl.get()+1);
System.out.println(Thread.currentThread().getName() + ":" + tl.get());
});
Thread t2 = new Thread(() -> {
tl.set(tl.get()-1);
System.out.println(Thread.currentThread().getName() + ":" + tl.get());
});
t1.start();t2.start();
t1.join();
t2.join();
System.out.println(Thread.currentThread().getName() + ":" + tl.get());
tl.remove();
}
输出结果:
main:10
Thread-1:9
Thread-0:11
main:10
总结
ThreadLocal是一个线程局部变量,不同线程持有一个副本,因为是该线程独有的局部变量,所以肯定是线程安全的。
源码很简单:Thread类有一个属性 ThreadLocal.ThreadLocalMap,以key=ThreadLocal,value=我们设置的value参数,存储在该ThreadLocalMap中。