简单分析Java线程编程中ThreadLocal类的使用.docVIP

简单分析Java线程编程中ThreadLocal类的使用.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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 关闭链接。 所以出于线程安全的考虑,必须将这段代码的两个方法进行

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档