专栏首页好派笔记如何实现一个线程多个ThreadLocal对象,每一个ThreadLocal对象是如何区分的呢?
原创

如何实现一个线程多个ThreadLocal对象,每一个ThreadLocal对象是如何区分的呢?

private final int threadLocalHashCode = nextHashCode();
private static AtomicInteger nextHashCode = new AtomicInteger();
private static final int HASH_INCREMENT = 0x61c88647;
private static int nextHashCode() {
      return nextHashCode.getAndAdd(HASH_INCREMENT);
}

  对于每一个ThreadLocal对象,都有一个final修饰的int型的threadLocalHashCode不可变属性,对于基本数据类型,可以认为它在初始化后就不可以进行修改,所以可以唯一确定一个ThreadLocal对象。   但是如何保证两个同时实例化的ThreadLocal对象有不同的threadLocalHashCode属性:在ThreadLocal类中,还包含了一个static修饰的AtomicInteger([əˈtɒmɪk]提供原子操作的Integer类)成员变量(即类变量)和一个static final修饰的常量(作为两个相邻nextHashCode的差值)。由于nextHashCode是类变量,所以每一次调用ThreadLocal类都可以保证nextHashCode被更新到新的值,并且下一次调用ThreadLocal类这个被更新的值仍然可用,同时AtomicInteger保证了nextHashCode自增的原子性。

为什么不直接用线程id来作为ThreadLocalMap的key?   这一点很容易理解,因为直接用线程id来作为ThreadLocalMap的key,无法区分放入ThreadLocalMap中的多个value。比如我们放入了两个字符串,你如何知道我要取出来的是哪一个字符串呢?   而使用ThreadLocal作为key就不一样了,由于每一个ThreadLocal对象都可以由threadLocalHashCode属性唯一区分或者说每一个ThreadLocal对象都可以由这个对象的名字唯一区分(下面的例子),所以可以用不同的ThreadLocal作为key,区分不同的value,方便存取。

public class Son implements Cloneable{
    public static void main(String[] args){
        Thread t = new Thread(new Runnable(){  
            public void run(){
            	ThreadLocal<Son> threadLocal1 = new ThreadLocal<>();
            	threadLocal1.set(new Son());
            	System.out.println(threadLocal1.get());
            	ThreadLocal<Son> threadLocal2 = new ThreadLocal<>();
            	threadLocal2.set(new Son());
            	System.out.println(threadLocal2.get());
            }}); 
        t.start();
    }
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

关注作者,阅读全部精彩内容

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ThreadLocal原理——实现多个线程从同一个对象获取相同类型对象实例

    ThreadLocal,网传可以实现多线程变量安全共享。其实它只是一个半成品,其本身并没有提供变量安全共享,它实现了一个多线程从同一个对象获取相同类型对象实例的...

    zhangheng
  • 详细领悟ThreadLocal变量

    关于对ThreadLocal变量的理解,我今天查看一下午的博客,自己也写了demo来测试来看自己的理解到底是不是那么回事。从看到博客引出不解,到仔细查看Thre...

    java思维导图
  • ThreadLocal和InheritableThreadLocal深入分析

      通过ThreadLocal和InheritableThreadLocal,我们能够很方便的设计出线程安全的类。JDK底层是如何做到的呢?ThreadLoca...

    良辰美景TT
  • 深入JDK源码之ThreadLocal类

    ThreadLocal概述 学习JDK中的类,首先看下JDK API对此类的描述,描述如下: 该类提供了线程局部 (thread-local) 变量。这些变量不...

    用户1263954
  • ThreadLocal浅入浅出

    ThreadLocal类用来提供线程内部的局部变量。这些变量在多线程环境下访问(通过get或set方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量,...

    居士
  • 反向理解ThreadLocal,或许这样更容易理解

    已经有那么多作者写ThreadLocal的源码分析,我还是想写下这篇,换个思路去分析。

    Java艺术
  • 谈谈Java中的ThreadLocal

    导读:ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本。通过ThreadLoc...

    码农架构
  • ThreadLocal详解

    ThreadLocal与synchronized的区别到底在哪里 synchronized这类线程同步的机制可以解决多线程并发问题,在这种解决方案下,多个线程...

    于霆霖
  • 探究ThreadLocal原理(基于JAVA8源码分析)线程封闭ThreadLocal是什么ThreadLoalMaphash冲突内存泄露避免内存泄露题外小话ThreadLocal的应用场合

    JavaEdge
  • 理解Java中的ThreadLocal

    提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总...

    技术小黑屋
  • 带你了解源码中的 ThreadLocal提问源码分析小彩蛋应用场景

    这次想来讲讲 ThreadLocal 这个很神奇的东西,最开始接触到这个是看了主席的《开发艺术探索》,后来是在研究 ViewRootImpl 中又碰到一次,而且...

    请叫我大苏
  • 用ThreadLocal来优化下代码吧

    它的意图是希望在方法内使用user的信息,但是如此大范围的传递用户信息,第一感觉就是不优雅。那有什么办法可以优化一下呢?

    全栈程序员站长
  • Java多线程编程-(10)-看了这篇关于ThreadLocal的原理应该透彻了

    ThreadLocal可以说是笔试面试的常客,每逢面试基本都会问到,关于ThreadLocal的原理以及不正当的使用造成的OOM内存溢出的问题,值得花时间仔细研...

    Java后端技术
  • Java中的ThreadLocal功能演示

    除了使用synchronized同步符号外,Java中的ThreadLocal是另一种实现线程安全的方法。在进行性能测试用例的编写过程中,比较简单的办法就是直接...

    FunTester
  • ThreadLocal能解决线程安全问题?胡扯!本文教你正确的使用姿势【享学Java】

    ThreadLocal:线程 + 本地 -> 线程本地变量(所以说我觉得它取名叫ThreadLocalVariable获取还更能让人易懂些),它的出镜率可不低。...

    YourBatman
  • 揭秘ThreadLocal

    ThreadLocal是开发中最常用的技术之一,也是面试重要的考点。本文将由浅入深,介绍ThreadLocal的使用方式、实现原理、内存泄漏问题以及使用场景。...

    大闲人柴毛毛
  • 对ThreadLocal实现原理的一点思考前言ThreadLocal是什么、有什么、能做什么?看一看ThreadLocal源码

    在《透彻理解Spring事务设计思想之手写实现》中,已经向大家揭示了Spring就是利用ThreadLocal来实现一个线程中的Connection是同一个,从...

    用户2890438
  • ThreadLocal Java多线程下的影分身之术

    如果写过多线程的代码,你肯定考虑过线程安全问题,更进一步你可能还考虑在在线程安全的前提下性能的问题。大多数情况下大家用来解决线程安全问题都会使用同步,比如用sy...

    xindoo
  • java面试必备之ThreadLocal

    按照传统的经验,如果某个对象是非线程安全的,在多线程环境下对象的访问需要采用synchronized进行同步。但是模板类并未采用线程同步机制,因为线程同步会降低...

    JKXQJ

作者介绍

好派笔记

秦皇岛经济技术开发区易云软件开发服务部技术总监

秦皇岛经济技术开发区易云软件开发服务部 · 技术总监 (已认证)

专栏

精选专题

活动推荐

扫码关注云+社区

领取腾讯云代金券