天天看点

ThreadLocal代码总结

代码

@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中。