Java超详细讲解ThreadLocal类的使用_第1页
Java超详细讲解ThreadLocal类的使用_第2页
Java超详细讲解ThreadLocal类的使用_第3页
Java超详细讲解ThreadLocal类的使用_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Java超详细讲解ThreadLocal类的使用目录Threadlocal有什么用:ThreadLocal使用实例API介绍ThreadLocal的使用Threadlocal的源码分析原理源码内部类ThreadLocalMapThreadLocalMap存储位置Key的弱引用问题java中的四种引用总结:

Threadlocal有什么用:

简单的说就是,一个ThreadLocal在一个线程中是共享的,在不同线程之间又是隔离的(每个线程都只能看到自己线程的值)。如下图:

ThreadLocal使用实例

API介绍

在使用Threadlocal之前我们先看以下它的API:

ThreadLocal类的API非常的简单,在这里比较重要的就是get()、set()、remove(),set用于赋值操作,get用于获取变量的值,remove就是删除当前变量的值.需要注意的是initialValue方法会在第一次调用时被触发,用于初始化当前变量值,默认情况下initialValue返回的是null。

ThreadLocal的使用

说完了ThreadLocal类的API了,那我们就来动手实践一下了,来理解前面的那句话:一个ThreadLocal在一个线程中是共享的,在不同线程之间又是隔离的(每个线程都只能看到自己线程的值)

publicclassThreadLocalTest{

privatestaticThreadLocalIntegerthreadLocal=newThreadLocalInteger(){

//重写这个方法,可以修改“线程变量”的初始值,默认是null

@Override

protectedIntegerinitialValue(){

return0;

publicstaticvoidmain(String[]args)throwsInterruptedException{

//一号线程

newThread(newRunnable(){

@Override

publicvoidrun(){

System.out.println("一号线程set前:"+threadLocal.get());

threadLocal.set(1);

System.out.println("一号线程set后:"+threadLocal.get());

}).start();

//二号线程

newThread(newRunnable(){

@Override

publicvoidrun(){

System.out.println("二号线程set前:"+threadLocal.get());

threadLocal.set(2);

System.out.println("二号线程set后:"+threadLocal.get());

}).start();

//主线程睡1s

Thread.sleep(1000);

//主线程

System.out.println("主线程的threadlocal值:"+threadLocal.get());

稍微解释一下上面的代码:

每一个ThreadLocal实例就类似于一个变量名,不同的ThreadLocal实例就是不同的变量名,它们内部会存有一个值(暂时这么理解)在后面的描述中所说的“ThreadLocal变量或者是线程变量”代表的就是ThreadLocal类的实例。

在类中创建了一个静态的“ThreadLocal变量”,在主线程中创建两个线程,在这两个线程中分别设置ThreadLocal变量为1和2。然后等待一号和二号线程执行完毕后,在主线程中查看ThreadLocal变量的值。

程序结果及分析⌛

程序结果重点看的是主线程输出的是0,如果是一个普通变量,在一号线程和二号线程中将普通变量设置为1和2,那么在一二号线程执行完毕后在打印这个变量,输出的值肯定是1或者2(到底输出哪一个由操作系统的线程调度逻辑有关)。但使用ThreadLocal变量通过两个线程赋值后,在主线程程中输出的却是初始值0。在这也就是为什么“一个ThreadLocal在一个线程中是共享的,在不同线程之间又是隔离的”,每个线程都只能看到自己线程的值,这也就是ThreadLocal的核心作用:实现线程范围的局部变量。

Threadlocal的源码分析

原理

每个Thread对象都有一个ThreadLocalMap,当创建一个ThreadLocal的时候,就会将该ThreadLocal对象添加到该Map中,其中键就是ThreadLocal,值可以是任意类型。这句话刚看可能不是很懂,下面我们一起看完源码就明白了。

前面我们的理解是所有的常量值或者是引用类型的引用都是保存在ThreadLocal实例中的,但实际上不是的,这种说法只是让我们更好的理解ThreadLocal变量这个概念。向T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论