关于ThreadLocal的理解

2016-10-30 13:12

ThreadLocal

ThreadLocal是一个关于创建线程局部变量的类。 通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。

  1. 创建,支持泛型,有get,set方法
ThreadLocal<String> stringThreadLocal = new ThreadLocal<>();
  1. 简单使用
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();
}
  1. 为ThreadLocal设置默认的get初始值,需要重写initialValue方法.

  2. 实际上ThreadLocal的值是放入了当前线程的一个ThreadLocalMap实例中,所以只能在本线程中访问,其他线程无法访问。ThreadLocal实例实际上也是被其创建的类持有。而ThreadLocal的值其实也是被线程实例持有。它们都是位于堆上,只是通过一些技巧将可见性修改成了线程可见。关于堆和栈的比较,请参考Java中的堆和栈的区别

  3. 它的使用场景有: 实现单个线程单例以及单个线程上下文信息存储,比如交易id等。 实现线程安全,非线程安全的对象使用ThreadLocal之后就会变得线程安全,因为每个线程都会有一个对应的实例。 承载一些线程相关的数据,避免在方法中来回传递参数。

类型:工作 标签:threadlocal,java

我与我周旋久 独孤影 开源实验室