java threadlocalrandom,threadlocal使用实例

  java threadlocalrandom,threadlocal使用实例

  00-1010 Threadlocal有什么用:ThreadLocal使用实例API介绍ThreadLocal使用thread local进行源代码分析的原理。源代码中内部类ThreadLocalMapThreadLocalMap存储位置键的弱引用。java中四个引用的总结:

  00-1010简单来说,一个ThreadLocal在一个线程中共享,在不同的线程中隔离(每个线程只能看到自己线程的值)。如下图:

  

目录

 

  00-1010在使用Threadlocal之前,我们先来看看下面的API:

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

  00-1010做完了ThreadLocal类的API,我们来练习一下,从而理解前面的那句话:一个ThreadLocal是在一个线程中共享的,在不同的线程之间是隔离的(每个线程只能看到自己的线程值)

  public thread local test { private static thread local integer thread local=new thread local integer(){//重写此方法修改“线程变量”的初始值。默认值为null @ override protected integer初始值(){ return 0;} };public static void main(string[]args)抛出中断异常{//1号线程new thread(newrunnable(){ @ override public void run(){ system . out . println( before 1号线程set: thread local . get()));thread local . set(1);system . out . println( thread one设置后: thread local . get()));} }).start();//线程二号new thread(newrunnable(){ @ override public void run(){ system . out . println( before thread number set: thread local . get()));thread local . set(2);System.out.println(二号线程设置后: thread local . get());} }).start();//主线程休眠1s thread . sleep(1000);//主线程System.out.println(主线程的threadlocal值: thread local . get());}}稍微解释一下上面的代码:

  每个ThreadLocal实例类似于一个变量名,不同的ThreadLocal实例是不同的变量名,它们里面会有一个值(暂时)。在下面的描述中,“ThreadLocal变量或线程变量”表示ThreadLocal类的实例。

  在类中创建一个静态的“ThreadLocal变量”,在主线程中创建两个线程,其中ThreadLocal变量分别设置为1和2。然后等待线程1和2完成执行,并检查主线程中ThreadLocal变量的值。

  结果和分析

  结果是主线程的输出为0。如果是普通变量,在线程1和线程2中将普通变量设置为1和2,然后在

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

  

 

  

Threadlocal 的源码分析

 

  

原理

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

 

  前面我们的理解是所有的常量值或者是引用类型的引用都是保存在ThreadLocal实例中的,但实际上不是的,这种说法只是让我们更好的理解ThreadLocal变量这个概念。向ThreadLocal存入一个值,实际上是向当前线程对象中的ThreadLocalMap存入值,ThreadLocalMap我们可以简单的理解成一个Map,而向这个Map存值的key就是ThreadLocal实例本身。

  

 

  

源码

 

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: