什么是ThreadLocal

    该类提供了线程局部变量,就是为每一个使用它的线程提供一个变量的副本,使每一个

线程可以独立的改变自己的副本,而不会和其它线程发生冲突。说白了就是解决对线程访问共享

资源时发生冲突的问题,也算是一种同步的方式。


ThreadLocal的实现原理

public class ThreadLocal  
{  
  private Map values = Collections.synchronizedMap(new HashMap());  
  public Object get()  
  {  
      Thread curThread = Thread.currentThread();  
      Object o = values.get(curThread);  
      if (o == null && !values.containsKey(curThread))  
      {  
          o = initialValue();  
          values.put(curThread, o);  
      }  
      return o;  
  }  
  public void set(Object newValue)  
  {  
      values.put(Thread.currentThread(), newValue);  
    }  
    public Object initialValue()  
    {  
      return null;  
  }  
}

    思路就是他的底层维护了一个线程安全的Map,Map就以键值对的形式存储线程对象和线程对象的副本值。


ThreadLocal的常用api

捕获.PNG

其中initialValue()方法用于返回此线程局部变量的当前线程的初始值,该方法是一个延迟调用的方法,只有当线程第一次调用get或者set

方法时,他才会执行,并且只执行这一次。还有他是一个protected修饰的方法,可以方便子类重写该方法,可以根据需求进行自定义的初始化。


ThreadLocal与其他同步机制的区别

    ThreadLocal与普通的同步机制都是为了解决多线程访问共享资源时会产生冲突的问题,普通的同步机制是控制了线程对共享资源的

访问时间而避免冲突的,他是多个线程进行通信的有效方式,而ThreadLocal则是在空间上对共享数据进行了隔离,从根本上来说,数据已经

不在共享了以此避免冲突。因此两种方式是在不同的角度所实现的线程安全。

    当我们需要多线程之间进行通信就使用同步机制,需要隔离多个线程之间的共相冲突,就是用ThreadLocal。