阅读了JDK的Thread、ThreadLocal源代码之后,有几点设计心得:
- Thread类,有一个ThreadLocal.ThreadLocalMap类型的成员变量
/* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */ ThreadLocal.ThreadLocalMap threadLocals = null;
这个变量不是static的,每个线程对象都会有自己的threadLocals,不会产生数据共享问题,因此不会导致线程安全问题;该变量初始值是null,这是因为并不是所有的线程都需要考虑线程安全问题,这样可以减少不必要对象的创建
- ThreadLocal的set方法,为什么key是this
public void set(T value) { // 获取进入ThreadLocal的当前线程 Thread t = Thread.currentThread(); // ThreadLocalMap是ThreadLocal的内部类,对使用者是透明的 // 如果第一次进入set,map值是null,因为Thread内部将其初始值设为null ThreadLocalMap map = getMap(t); if (map != null) { map.set(this,value); } else { createMap(t, value); } }
首先每个Thread对象都只会有1个ThreadLocal.ThreadLocalMap成员变量,但是一个线程使用多少个ThreadLocal则是不确定的。Thread每次使用ThreadLocal的时候,都应该是相互独立的,而且key不能是重复的。由于java对象的内存地址的唯一性,所以使用ThreadLocal作为key,很安全,不会重复。
如果不这样设计,难以满足下面代码的使用
public class Test { private ThreadLocal<String> StringLocal = new ThreadLocal<String>(); private ThreadLocal<Integer> intLocal = new ThreadLocal<Integer>(); // 1个方法使用2个ThreadLocal对象进行值存储 public void setValue(String strVal, int intVal) { StringLocal.set(strVal); intLocal.set(intVal); } }
相关推荐
**标题:“JDK的ThreadLocal理解(一)使用和测试”** **正文:** ThreadLocal是Java中的一个非常重要的线程安全工具类,它在多线程编程中扮演着独特的角色。通过创建ThreadLocal实例,我们可以为每个线程提供一个...
本文将深入探讨JDK10的底层实现,特别是C++源码以及HotSpot虚拟机的源码,帮助开发者更好地理解和优化Java应用程序。 首先,让我们了解JDK10的关键特性: 1. **局部变量类型推断(Local-Variable Type Inference,...
**ThreadLocal概述** ThreadLocal是Java中的一个线程局部变量类,它...通过理解ThreadLocal的原理和最佳实践,我们可以更有效地利用它来解决多线程环境下的数据隔离问题,同时也需要注意防止可能出现的内存泄漏风险。
8. **并发(Concurrency)**:"sun"包中的并发工具类源码展示了Java如何实现线程安全和高性能的并发控制,如Synchronized、Lock、ThreadLocal等。 通过研究这些源码,开发者不仅可以学习到Java语言的细节,还能掌握...
jdk8源码的阅读理解 导入idea步骤: 阅读顺序: 大致思路 基本类型的包装类(Character放在最后) String、StringBuffer、StringBuilder、StringJoiner、StringTokenizer(补充正则表达式的知识) CharacterIterator、...
remove是java.lang.ThreadLocal类的方法,但是jdk1.4中,却没有这个方法的实现,jdk1.5中有这个方法,因此是没问题的; 本jar包经过改造,适用于JDK1.4,需要第三方JAR包的支持(commons-beanutils-1.8.2.jar,commons...
在IT行业中,深入理解JDK源码是提升编程技能的关键步骤。"jdksource:jdk源码阅读"项目正为此目的而设立,它提供了一个平台,让开发者能够详细探索Java开发工具包(Java Development Kit)的内部工作原理。通过阅读...
ThreadLocal是JDK包提供的,它提供了线程本地变量,也就是如果你创建了一个ThreadLocal变量,那么访问这个变量的每一个线程都会有这个变量的一个本地副本。当多线程操作这个变量时,实际操作的就是自己本地内存里面...
jdk源码学习 JavaSourceLearn 版本号 版本 corretto-1.8.0_275 方式 逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 ...
remove是java.lang.ThreadLocal类的方法,但是jdk1.4中,却没有这个方法的实现,jdk1.5中有这个方法,因此是没问题的; 本jar包经过改造,适用于JDK1.4,需要第三方JAR包的支持(commons-beanutils-1.8.2.jar,commons-...
JDK1.8源码分析 相关的原始码分析结果会以注解的形式体现到原始码中 已完成部分: ReentrantLock CountDownLatch Semaphore HashMap TreeMap LinkedHashMap ConcurrentHashMap 执行器 ...
InheritableThreadLocal跟ThreadLocal差不多,关键点在Thread#init方法中会对Thread中的实例变量inheritableThreadLocals进行赋值操作,将父线程的本地变量复制到子线程中 首先通过ServiceLoader.load方法生成一个...
java8 源码 Java8-Source-Code 简介 Java8源码学习 ├── ...├── java/(常用代码都在此文件夹下) ...ThreadLocal ├── javax/ ├── launcher/ ├── org/ 技术交流 博客地址: QQ群:专注的程序猿 282087535
JDK源码阅读笔记 Condition CountDownLatch CyclicBarrier ReadWriteLock ReentrantLock Socket UDP IO FileChannel Buffer URLConnection NIO Process HashMap LinkedHashMap TreeMap ...
Java大师级源码 Java8-Source-Code 简介 Java8源码学习 ├── ...├── java/(常用代码都在此文件夹下) ...ThreadLocal ├── javax/ ├── launcher/ ├── org/ 技术交流 博客地址: QQ群:专注的程序猿 282087535
- 核心库分析:深入JDK源码,如Collections、Stream、反射等模块,了解其内部实现机制。 - 设计模式:学习Java源码中常见的设计模式,如单例、工厂、观察者等,提升代码质量。 - 内存模型:理解JVM内存结构,如堆...
java8 源码 Java8-Source-Code 简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ...ThreadLocal ├── javax/ ├── launcher/ ├── org/
1. **JDK源码分析**:理解JDK源码对于提升编程能力至关重要。通过阅读和分析源码,开发者可以深入理解Java的基础组件如何工作,如集合框架、I/O流、线程管理等。这有助于编写更高效、更稳定的代码,并能解决实际开发...
ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析....
18.一篇文章,从源码深入详解ThreadLocal内存泄漏问题 19.并发容器之BlockingQueue 20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解 21.线程池ThreadPoolExecutor实现原理 22.线程池之...