ThreadLocal
ThreadLocal是一个关于创建线程局部变量的类。 通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。
- 创建,支持泛型,有get,set方法
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方法.
实际上ThreadLocal的值是放入了当前线程的一个ThreadLocalMap实例中,所以只能在本线程中访问,其他线程无法访问。ThreadLocal实例实际上也是被其创建的类持有。而ThreadLocal的值其实也是被线程实例持有。它们都是位于堆上,只是通过一些技巧将可见性修改成了线程可见。关于堆和栈的比较,请参考Java中的堆和栈的区别 。
它的使用场景有: 实现单个线程单例以及单个线程上下文信息存储,比如交易id等。 实现线程安全,非线程安全的对象使用ThreadLocal之后就会变得线程安全,因为每个线程都会有一个对应的实例。 承载一些线程相关的数据,避免在方法中来回传递参数。