ThreadLocal概述和API
来源:互联网 发布:jaba 并发编程 编辑:程序博客网 时间:2024/06/08 13:44
一、概述
ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。
也许把它命名为ThreadLocalVar更加合适。
线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,
是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。
从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;
在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。
通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM 为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。
ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,
而ThreadLocal采用了“以空间换时间”的方式。
- 前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
ThreadLocal:线程局部变量,是一种多线程间并发访问变量的解决方案。
与其synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程安全。
从性能上说,ThreadLocal不具有绝对的优势,在并发不是很高的时候,加锁的性能会跟好,
但作为一套与锁完全无关的线程安全解决方案,在高并发量或者竞争激烈的场景,使用ThreadLocal可以在一定程度上减少锁竞争。
二、API说明
ThreadLocal()
创建一个线程本地变量。
T get()
返回此线程局部变量的当前线程副本中的值,如果这是线程第一次调用该方法,则创建并初始化此副本。
protected T initialValue()
返回此线程局部变量的当前线程的初始值。
最多在每次访问线程来获得每个线程局部变量时调用此方法一次,即线程第一次使用 get() 方法访问变量的时候。
如果线程先于 get 方法调用 set(T) 方法,则不会在线程中再调用 initialValue 方法。
若该实现只返回 null;
如果程序员希望将线程局部变量初始化为 null 以外的某个值,则必须为 ThreadLocal 创建子类,并重写此方法。
通常,将使用匿名内部类。initialValue 的典型实现将调用一个适当的构造方法,并返回新构造的对象。
void remove()
移除此线程局部变量的值。这可能有助于减少线程局部变量的存储需求。
如果再次访问此线程局部变量,那么在默认情况下它将拥有其 initialValue。
void set(T value)
将此线程局部变量的当前线程副本中的值设置为指定值。
许多应用程序不需要这项功能,它们只依赖于 initialValue() 方法来设置线程局部变量的值。
在程序中一般都重写initialValue方法,以给定一个特定的初始值。
- 希望将类的某个静态变量(user ID或者transaction ID)与线程状态关联,则可以考虑使用ThreadLocal。
ThreadLocal应用和那些“坑”
阅读全文
1 0
- ThreadLocal概述和API
- ThreadLocal 概述
- 【Android API指南】动画和图像概述
- API指南--动画和图像—概述
- ios 2.6.1 API概述和开发
- API概述
- 常用对象API(集合框架--概述,体系和共性功能)
- 常用对象API(集合框架--概述,体系和共性功能)
- FFMPEG学习【libavcodec】:发送/接收编码和解码API概述
- Request对象的概述和API的介绍
- request和ThreadLocal
- ThreadLocal介绍和用法
- ThreadLocal分析和研究
- ThreadLocal理解和运用
- ThreadLocal和Synchonized
- 多线程Atomic和ThreadLocal
- 多线程Atomic和ThreadLocal
- ThreadLocal用法和原理
- Error:Jack is required to support java 8 language features. 及Jack的介绍
- 二叉树前序、中序、后序遍历非递归写法
- 网络I/O虚拟化,SR-IOV技术
- RecyclerView实现滚动滑动以及点击改变控件颜色
- 端到端深度学习与自动驾驶(含参考文献)
- ThreadLocal概述和API
- Android 智能指针详解 -- wp
- 博客更新迁移至头条号:great小海海
- 判断资产存在
- Linux基本操作(二)
- SQL 递归写法
- 打印去掉就不可以运行:bug玩法。
- 在JeeWeb中自动生成代码模块添加上传功能
- 在服务中添加mysql服务