Java - ThreadLocal解析

首先声明,ThreadLocal不是用来解决共享变量问题的,而是在不同的是线程中存放该线程自身的变量(eg: session,每个线程都可以有一个session变量,但是每个线程的session变量指向的对象不一样,可以看做都是ThreadLocal变量,但是该ThreadLocal变量在不同的线程可能有不同的值)。

这个看源码就清楚了:

ThreadLocal#set

首先是获取当前线程的ThreadLocalMap对象,然后以当前的ThreadLocal对象为键,需要设置的value为值。ThreadLocalMap为ThreadLocal的一个内部类,是Thread的一个属性。为什么需要用一个map来存呢?因为一个线程可以有多个ThreadLocal变量,这些ThreadLocal变量都存放在ThreadLocalMap对象中,当线程要使用某个ThreadLocal变量时,通过ThreadLocal#get方法获取本ThreadLocal变量在本线程的值

ThreadLocal#get

比如说有两个ThreadLocal变量:tl1,tl2;有两个Thread:t1,t2;

在线程t1中设值:tl1.set(1),tl2.set("t1")

在线程t2中设值:tl1.set(2),tl2.set("t2")

获取值:

线程t1:tl1.get() -> 1 ;tl2.get() -> "t1"

线程t2:tl1.get() -> 2 ;tl2.get() -> "t2"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 刚看过EventBus和AndroidEventBus的源码, 发现里面都有用到ThreadLocal, 那...
    海之韵Baby阅读 2,607评论 0 0
  • 前言 在各大公司招聘笔试和面试题题中,都遇到了很多ThreadLocal的问题,最近博主在面试的时候也被两次问到过...
    Kevin_ZGJ阅读 3,138评论 1 3
  • 概述 用于同一个线程内的方法要共享某些变量或状态的时候,提供线程内的局部变量,这种变量在线程的生命周期内起作用,减...
    LNAmp阅读 10,439评论 0 9
  • 一、简介 首先我们需要知道Thread.currentThread()获取当前线程对象,同一个线程每次获取的都是同...
    道常阅读 1,937评论 0 0
  • 不高兴先生给没头脑小姐买了一把情侣伞。这是一把黑色的自动伞,伞内部印着埃菲尔铁塔的图,符合他内敛低调其实就是闷骚的...
    公子钰798阅读 1,826评论 0 0