ThreadLocal概述和API

来源:互联网 发布:jaba 并发编程 编辑:程序博客网 时间:2024/06/08 13:44
一、概述
  1. ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。
  2. 也许把它命名为ThreadLocalVar更加合适。
  3. 线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本
  4. Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。
  5. 从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;
  6. 在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。
  7. 通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM 为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。
  8. ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。
  9. 概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,ThreadLocal采用了“以空间换时间”的方式
  10. 前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
  1. ThreadLocal:线程局部变量,是一种多线程间并发访问变量的解决方案。
  2. 与其synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程安全。
  3. 从性能上说,ThreadLocal不具有绝对的优势,在并发不是很高的时候,加锁的性能会跟好
  4. 但作为一套与锁完全无关的线程安全解决方案,在高并发量或者竞争激烈的场景,使用ThreadLocal可以在一定程度上减少锁竞争



二、API说明

  1. ThreadLocal()
    1. 创建一个线程本地变量。

  2. T get()
    1. 返回此线程局部变量的当前线程副本中的值,如果这是线程第一次调用该方法,则创建并初始化此副本。

  3. protected T initialValue()
    1. 返回此线程局部变量的当前线程的初始值。
    2. 最多在每次访问线程来获得每个线程局部变量时调用此方法一次,即线程第一次使用 get() 方法访问变量的时候。
    3. 如果线程先于 get 方法调用 set(T) 方法,则不会在线程中再调用 initialValue 方法。
    4. 若该实现只返回 null
    5. 如果程序员希望将线程局部变量初始化为 null 以外的某个值,则必须为 ThreadLocal 创建子类,并重写此方法。
    6. 通常,将使用匿名内部类。initialValue 的典型实现将调用一个适当的构造方法,并返回新构造的对象。

  4. void remove()
    1. 移除此线程局部变量的值。这可能有助于减少线程局部变量的存储需求。
    2. 如果再次访问此线程局部变量,那么在默认情况下它将拥有其 initialValue
  5. void set(T value)
    1. 将此线程局部变量的当前线程副本中的值设置为指定值。
    2. 许多应用程序不需要这项功能,它们只依赖于 initialValue() 方法来设置线程局部变量的值。

  6. 在程序中一般都重写initialValue方法,以给定一个特定的初始值。
  • 希望将类的某个静态变量(user ID或者transaction ID)与线程状态关联,则可以考虑使用ThreadLocal。
ThreadLocal应用和那些“坑”
原创粉丝点击