- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
简单分析Java线程编程中ThreadLocal类的使用.doc
简单分析Java线程编程中ThreadLocal类的使用
这篇文章主要介绍了 Java线程编程屮ThreadLocal类的使用,包括使用其对共享变量的操作的 分析,需要的朋友可以参考下
一、概述
ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个 Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。 线程局部变量仃hreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一 个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改 变自己的副本,而不会和其它线程的副本冲突。
从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活 动的并且ThreadLocal实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会 被垃圾回收(除非存在对这些副本的其他引用)。
通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM为每个运行的线程, 绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离 机制。
ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在 ThreadLocal类屮有一个Map,用于存储每一个线程的变量的副本。
概括起来说,对于多线程资源共享的问题,同步机制采用了 “以时间换空间”的方式,而 ThreadLocal釆用了 “以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访 问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
二、API说明
ThreadLocal()
创建一个线程本地变量。
T get()
返回此线程局部变量的当前线程副本中的值,如果这是线程第一次调用该方法, 则创建并初始化此副本。
protected T initialValue()
返回此线程局部变量的当前线程的初始值。最多在每次访问线程来获得每个线 程局部变量时调用此方法一次,即线程第一次使用get()方法访问变量的时候。如果线程先 于get方法调用set(T)方法,贝!I不会在线程中再调用initialvalue方法。
若该实现只返回null;如果程序员希望将线程局部变量初始化为null以外的某个值, 则必须为ThreadLocal创建子类,并重写此方法。通常,将使用匿名内部类q initialvalue的 典型实现将调用一个适当的构造方法,并返回新构造的对象。
void remove()
移除此线程局部变量的值。这可能有助于减少线程局部变量的存储需求。如果 再次访问此线程局部变量,那么在默认情况下它将拥有其initialValue-
void set(T value)
将此线程局部变量的当前线程副本中的值设置为指定值。许多应用程序不需要 这项功能,它们只依赖于initialValuef)方法来设置线程局部变量的值。
在程序中一般都重写initialvalue方法,以给定一个特定的初始值。
三、一.对ThreadLocal的理解
ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差 不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个 线程可以访问自己内部的副本变量。
这句话从字面上看起来很容易理解,但是真止理解并不是那么容易。
我们还是先来看一个例子:
public staticconn ect =}
public static
conn ect =
} public
Conn ection openC onn ection() { 讦(connect == null){
DriverManager.HYPERLINK getConnectionfgetConnectionf); } return connect; static void closeConnection() { 讦(connect!=null) connect.close(); }}
假设有这样一个数据库链接管理类,这段代码在单线程中使用是没有任何问题的,但 是如果在多线程屮使用呢?很显然,在多线程屮使用会存在线程安全问题:第一,这里面的 2个方法都没有进行同步,很可能在openConnection方法中会多次创建connect;第二,由 于connect是共亨变量,那么必然在调用connect的地方需要使用到同步来保障线程安全, 因为很可能一个线程在使用connect进行数据库操作,而另外一个线程调用closeConnection 关闭链接。
所以出于线程安全的考虑,必须将这段代码的两个方法进行
您可能关注的文档
最近下载
- 中医治疗带状疱疹后遗神经痛的研究.doc VIP
- 江铃-江铃E400-产品使用说明书-E400豪华型-JX70021BEV-江铃E400使用说明书.pdf VIP
- ISO IEC 27017-2015 信息技术--安全技术--基于ISO IEC 27002的云服务信息安全控制实践准则.pdf
- 脑疝病人的护理课件(完整版).pptx VIP
- 4-6岁 《游来游去的水母》-美术课件.ppt VIP
- 100个超级有趣的冷知识.pdf VIP
- 指挥调度系统项目可行性研究报告.docx VIP
- 公司节能减排方案.pptx VIP
- RBANS记录表(精分,重度抑郁,焦虑障碍,正常对照).docx VIP
- 重症医学科绩效考核.ppt VIP
文档评论(0)