`
geeksun
  • 浏览: 953513 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ThreadLocal 源码分析

 
阅读更多

ThreadLocal字段意义为线程本地,其实表达不够准确,应该为线程本地变量或线程局部变量更合适一些。

ThreadLocal 常用来存储每个线程的私有信息,相当于是线程组的私有变量容器,每个变量值为单一线程私有,不被其他线程共享。

ThreadLocal类的方法解析:

 

    protected T initialValue() {
        return null;
    }

initialValue方法用来初始化线程变量容器的数据,相当于调用了set方法设置线程实例与变量的关联关系,此方法在需要初始化时可以被覆盖, 实现具体的初始化数据逻辑。

 

    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();
    }

get方法用来获取ThreadLocal的本地变量容器的值, 当ThreadLocalMap不为null时,返回ThreadLocalMap里的值,当ThreadLocalMap为null时,返回initialValue方法的初始值。

 

    private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }

 setInitialValue方法用来设置初始化值,把初始值放入ThreadLocalMap里,这里可以看出,ThreadLocal的变量容器为ThreadLocalMap, ThreadLocalMap为一种为ThreadLocal订制的HashMap。

 

    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

 set方法用来为线程容器设置变量值。

 

     public void remove() {
         ThreadLocalMap m = getMap(Thread.currentThread());
         if (m != null)
             m.remove(this);
     }

 remove方法用来移除ThreadLocal的容器ThreadLocalMap中设置的变量值。

 

小结:

ThreadLocal用来多线程场景下,使用ThreadLocalMap来保证线程的安全性和隔离性,保证了线程变量的私有性,比如可以存放每个线程对应的jdbc的connetion,或存储每个线程的序列号。

分享到:
评论

相关推荐

    ThreadLocal_ThreadLocal源码分析_

    ThreadLocal源码分析,主要有ThreadLocal源码以及ThreadLocal的内部结构在jdk8前后的变化

    ThreadLocal源码分析

    首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。

    ThreadLocal源码分析和使用

    ThreadLocal源码分析和使用

    ThreadLocal_ThreadLocal源码分析_源码.zip

    ThreadLocal_ThreadLocal源码分析_源码.zip

    java并发包源码分析(3)ThreadLocal

    java并发包源码分析(3)ThreadLocal 详细配图讲解 java并发包源码分析(3)ThreadLocal 详细配图讲解

    ThreadLocal 线程本地变量 及 源码分析.rar_开发_设计

    ThreadLocal 线程微本地变量 及 源码分析

    Java并发编程学习之ThreadLocal源码详析

    主要给大家介绍了关于Java并发编程学习之源码分析ThreadLocal的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    ThreadLocal的原理,源码深度分析及使用.docx

    ThreadLocal的原理,源码深度分析及使用.docx,这是一份ThreadLocal的技术文档

    对ThreadLocal的理解【源码分析+应用举例】

    一、简介 ThreadLocal是JDK包提供的,它提供了线程本地变量,也就是如果你创建了一个ThreadLocal变量,那么访问这个变量的每一个线程都会有这个变量的一个本地副本。...根据源码,画出ThreadLocal原理图 原创文章

    ThreadLocal内存泄露分析

    NULL 博文链接:https://liuinsect.iteye.com/blog/1827012

    Android 详解ThreadLocal及InheritableThreadLocal

     分析都是基于android sdk 23 源码进行的,ThreadLocal在android和jdk中的实现可能并不一致。  在最初使用Threadlocal的时候,很容易会产生的误解就是threadlocal就是一个线程。  首先来看下Threadlocal的简单...

    activiti源码分析

    activiti源码分析,详细介绍工作流的基础框架和一些源码

    ThreadLocal分析

    NULL 博文链接:https://gerrard-ok.iteye.com/blog/1851903

    Java并发编程学习笔记

    5、Condition源码分析 6、ReentrantReadWriteLock底层实现原理 7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、线程池原理和如何使用线程池 9、ThreadLocal 为什么会内存泄漏 10、Volatile...

    jdk1.8-source:JDK1.8源码分析包

    JDK1.8源码分析 相关的原始码分析结果会以注解的形式体现到原始码中 已完成部分: ReentrantLock CountDownLatch Semaphore HashMap TreeMap LinkedHashMap ConcurrentHashMap 执行器 ...

    并发编程总结.xmind

    java并发编程总结,包括多线程安全机制分析总结,Unsafe源码分析总结,并发工具类总结,ThreadLocal原理和使用,Fork/Join框架使用总结,同步容器和并发容器源码分析

    架构探险 原书源码

    接着通过一个简单的应用场景,为该 Web 应用添加若干业务功能,从需求分析与系统设计开始,带领读者动手完成该 Web 应用,完善相关细节,并对已有代码进行优化;然后基于传统 Servlet 框架搭建一款轻量级 Java Web ...

    积分管理系统java源码-AndroidKnowledgeSystem:Android知识架构体系

    源码分析concurrent包 ConcurrentHashMap CopyOnWriteArrayList BlockingQeque ThreadLocal 反射 Kotlin Kotlin的优势 协程 Android热门技术 代码插桩技术 动态代理 插件化 热修复 日志系统 OKHttp Jetpack LiveData...

    Java 高并发九:锁的优化和注意事项详解

    本文主要介绍Java高并发锁的优化和注意事项,这里整理了详细的资料,并讲解了 1. 锁优化的思路和方法 2. 虚拟机内的锁优化 3. 一个错误使用锁的案例 4. ThreadLocal及其源码分析等知识,有需要的小伙伴可以参考下

    阿里P7面试题整理集合

    1)多线程(ThreadLocal(问了父子线程怎么共享数据 interitableThreadLocals)、lock和sync区别(问HashMap1.7、1.8区别时带出)、 AQS原理(执行过程源码,入队出队的细节,源码细节)、CountDownLatch和 ...

Global site tag (gtag.js) - Google Analytics