ThreadLocal简单用法-记录

ThreadLocal提供的方法:

  1. public T get() { }
  2. public void set(T value) { }
  3. public void remove() { }
  4. protected T initialValue() { }

get() 获取ThreadLocal在当前线程中保存的变量的副本

set() 设置ThreadLocal在当前线程中保存的变量的副本的值

remove() 删除值

initialValue() 获取值

 

ThreadLocal的主要存储数据的是  ThreadLocal 的  ThreadLocalMap这个内部类

其键是,当前线程里面的  ThreadLocal 对象(看源码可以知道)

实际的通过ThreadLocal创建的副本是存储在每个线程自己的threadLocals中的;

本人文笔不好,也愚笨,精彩的源码讲解请移步:https://www.cnblogs.com/dolphin0520/p/3920407.html

此处放个例子:

public class ThreadLocalExample {

    // jdk建议将 ThreadLocal 定义为 private static ,这样就不会有弱引用,内存泄漏的问题了
    private static ThreadLocal nameTh = new ThreadLocal(){
        @Override
        protected String initialValue() {
            return "如果 没有初始化,然后没有 set 就get的话,将会报错。";
        }
    };

    public String get(){
        return nameTh.get();
    }

    public void set(String name){
        this.nameTh.set(name);
    }

    public static void main(String[] args) {
        final ThreadLocalExample th = new ThreadLocalExample();

        th.set("主线程 main...");

        new Thread(()->{
            th.set("lcm");
            System.out.println(Thread.currentThread().getName()+"--"+ th.get() );
        }).start();


        new Thread(()->{
            th.set("zzq");
            System.out.println(Thread.currentThread().getName()+"--"+ th.get() );
        }).start();

        System.out.println(Thread.currentThread().getName()+"--"+ th.get() );
    }

}

 

你可能感兴趣的:(并发,并发)