简单分析java线程编程中threadlocal类的使用

简单分析java线程编程中threadlocal类的使用

ID:30921551

大小:64.15 KB

页数:5页

时间:2019-01-04

简单分析java线程编程中threadlocal类的使用_第1页
简单分析java线程编程中threadlocal类的使用_第2页
简单分析java线程编程中threadlocal类的使用_第3页
简单分析java线程编程中threadlocal类的使用_第4页
简单分析java线程编程中threadlocal类的使用_第5页
资源描述:

《简单分析java线程编程中threadlocal类的使用》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、简单分析Java线程编程中ThreadLocal类的使用这篇文章主要介绍了Java线程编程屮ThreadLocal类的使用,包括使用其对共享变量的操作的分析,需要的朋友可以参考下一、概述ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量仃hreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特

2、殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且ThreadLocal实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其

3、实实现的思路很简单,在ThreadLocal类屮有一个Map,用于存储每一个线程的变量的副本。概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal釆用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。二、API说明ThreadLocal()创建一个线程本地变量。Tget()返回此线程局部变量的当前线程副本中的值,如果这是线程第一次调用该方法,则创建并初始化此副本。protectedTinitialValue(

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

5、减少线程局部变量的存储需求。如果再次访问此线程局部变量,那么在默认情况下它将拥有其initialValue-voidset(Tvalue)将此线程局部变量的当前线程副本中的值设置为指定值。许多应用程序不需要这项功能,它们只依赖于initialValuef)方法来设置线程局部变量的值。在程序中一般都重写initialvalue方法,以给定一个特定的初始值。三、一.对ThreadLocal的理解ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线

6、程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。这句话从字面上看起来很容易理解,但是真止理解并不是那么容易。我们还是先来看一个例子:publicstaticconnect=}publicclassConnectionManager{privatestaticConnectionconnect=null;ConnectionopenConnection(){讦(connect==null){DriverManager.www.visal58.comgetConnectionf);}returnconnect;staticvo

7、idcloseConnection(){讦(connect!=null)connect.close();}}假设有这样一个数据库链接管理类,这段代码在单线程中使用是没有任何问题的,但是如果在多线程屮使用呢?很显然,在多线程屮使用会存在线程安全问题:第一,这里面的2个方法都没有进行同步,很可能在openConnection方法中会多次创建connect;第二,由于connect是共亨变量,那么必然在调用connect的地方需要使用到同步来保障线程安全,因为很可能一个线程在使用connect进行数据库操作,而另外一个线程调用closeCon

8、nection关闭链接。所以出于线程安全的考虑,必须将这段代码的两个方法进行同步处理,并且在调用connect的地方需要进彳亍同步处理。这样将会大大影响程序执行效率,因为一个线程在使用connect进行数据

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。