ThreadLocal是一个关于建立线程局部变量的类。 一般状况下,咱们建立的变量是能够被任何一个线程访问并修改的。而使用ThreadLocal建立的变量只能被当前线程访问,其余线程则没法访问和修改。安全
ThreadLocal<String> stringThreadLocal = new ThreadLocal<>();
private void test() { Thread t = new Thread() { ThreadLocal<String> stringThreadLocal = new ThreadLocal<>(); @Override public void run() { super.run(); stringThreadLocal ("www.yuxianghe.net"); stringThreadLocal (); } }; t.start(); }
为ThreadLocal设置默认的get初始值,须要重写initialValue方法.ide
实际上ThreadLocal的值是放入了当前线程的一个ThreadLocalMap实例中,因此只能在本线程中访问,其余线程没法访问。ThreadLocal实例实际上也是被其建立的类持有。而ThreadLocal的值其实也是被线程实例持有。它们都是位于堆上,只是经过一些技巧将可见性修改为了线程可见。关于堆和栈的比较,请参考Java中的堆和栈的区别 。.net
它的使用场景有: 实现单个线程单例以及单个线程上下文信息存储,好比交易id等。 实现线程安全,非线程安全的对象使用ThreadLocal以后就会变得线程安全,由于每一个线程都会有一个对应的实例。 承载一些线程相关的数据,避免在方法中来回传递参数。线程