`
aty
  • 浏览: 36545 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JDK的ThreadLocal理解(二)jdk源码的心得

阅读更多

  阅读了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理解(一)使用和测试

    **标题:“JDK的ThreadLocal理解(一)使用和测试”** **正文:** ThreadLocal是Java中的一个非常重要的线程安全工具类,它在多线程编程中扮演着独特的角色。通过创建ThreadLocal实例,我们可以为每个线程提供一个...

    JDK10(JDK10底层C++源码及hotspot虚拟机源码)

    本文将深入探讨JDK10的底层实现,特别是C++源码以及HotSpot虚拟机的源码,帮助开发者更好地理解和优化Java应用程序。 首先,让我们了解JDK10的关键特性: 1. **局部变量类型推断(Local-Variable Type Inference,...

    ThreadLocal_ThreadLocal源码分析_

    **ThreadLocal概述** ThreadLocal是Java中的一个线程局部变量类,它...通过理解ThreadLocal的原理和最佳实践,我们可以更有效地利用它来解决多线程环境下的数据隔离问题,同时也需要注意防止可能出现的内存泄漏风险。

    jdk1.8 全部源码,包括sun

    8. **并发(Concurrency)**:"sun"包中的并发工具类源码展示了Java如何实现线程安全和高性能的并发控制,如Synchronized、Lock、ThreadLocal等。 通过研究这些源码,开发者不仅可以学习到Java语言的细节,还能掌握...

    java8源码-jdk8:jdk8源码阅读理解

    jdk8源码的阅读理解 导入idea步骤: 阅读顺序: 大致思路 基本类型的包装类(Character放在最后) String、StringBuffer、StringBuilder、StringJoiner、StringTokenizer(补充正则表达式的知识) CharacterIterator、...

    修改版json-lib-2.4-jdk14与json-lib-2.4-jdk13 支持JDK1.4与1.3与1.5

    remove是java.lang.ThreadLocal类的方法,但是jdk1.4中,却没有这个方法的实现,jdk1.5中有这个方法,因此是没问题的; 本jar包经过改造,适用于JDK1.4,需要第三方JAR包的支持(commons-beanutils-1.8.2.jar,commons...

    jdksource:jdk源码阅读

    在IT行业中,深入理解JDK源码是提升编程技能的关键步骤。"jdksource:jdk源码阅读"项目正为此目的而设立,它提供了一个平台,让开发者能够详细探索Java开发工具包(Java Development Kit)的内部工作原理。通过阅读...

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

    ThreadLocal是JDK包提供的,它提供了线程本地变量,也就是如果你创建了一个ThreadLocal变量,那么访问这个变量的每一个线程都会有这个变量的一个本地副本。当多线程操作这个变量时,实际操作的就是自己本地内存里面...

    javajdk源码学习-JavaSourceLearn:JDK源码学习

    jdk源码学习 JavaSourceLearn 版本号 版本 corretto-1.8.0_275 方式 逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 ...

    json-lib-2.4-jdk14.jar

    remove是java.lang.ThreadLocal类的方法,但是jdk1.4中,却没有这个方法的实现,jdk1.5中有这个方法,因此是没问题的; 本jar包经过改造,适用于JDK1.4,需要第三方JAR包的支持(commons-beanutils-1.8.2.jar,commons-...

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

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

    java1.8源码-jdk1.8.0_111:JDK1.8源码注释

    InheritableThreadLocal跟ThreadLocal差不多,关键点在Thread#init方法中会对Thread中的实例变量inheritableThreadLocals进行赋值操作,将父线程的本地变量复制到子线程中 首先通过ServiceLoader.load方法生成一个...

    java8源码-jdk8-source:jdk8-源代码

    java8 源码 Java8-Source-Code 简介 Java8源码学习 ├── ...├── java/(常用代码都在此文件夹下) ...ThreadLocal ├── javax/ ├── launcher/ ├── org/ 技术交流 博客地址: QQ群:专注的程序猿 282087535

    JDK_seaswalker.tar.gz

    JDK源码阅读笔记 Condition CountDownLatch CyclicBarrier ReadWriteLock ReentrantLock Socket UDP IO FileChannel Buffer URLConnection NIO Process HashMap LinkedHashMap TreeMap ...

    Java大师级源码-Java8-Source-Code-master:jdk1.8源码,无注释版本

    Java大师级源码 Java8-Source-Code 简介 Java8源码学习 ├── ...├── java/(常用代码都在此文件夹下) ...ThreadLocal ├── javax/ ├── launcher/ ├── org/ 技术交流 博客地址: QQ群:专注的程序猿 282087535

    java源码笔记

    - 核心库分析:深入JDK源码,如Collections、Stream、反射等模块,了解其内部实现机制。 - 设计模式:学习Java源码中常见的设计模式,如单例、工厂、观察者等,提升代码质量。 - 内存模型:理解JVM内存结构,如堆...

    java8源码-jdk8-code:jdk1.8

    java8 源码 Java8-Source-Code 简介 Java8源码学习 ├── com/ ├── java/(常用代码都在此文件夹下) │ ├── lang/ │ │ ├── ...ThreadLocal ├── javax/ ├── launcher/ ├── org/

    JavaNotes::brick:“ Java学习+面试指南”在很大程度上覆盖了Java程序员所需要掌握的核心知识。JDK源码分析&Java新特性&Java并发编程&Java虚拟机&SpringBoot 2.x系列

    1. **JDK源码分析**:理解JDK源码对于提升编程能力至关重要。通过阅读和分析源码,开发者可以深入理解Java的基础组件如何工作,如集合框架、I/O流、线程管理等。这有助于编写更高效、更稳定的代码,并能解决实际开发...

    Java并发编程原理与实战

    ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析....

    【2018最新最详细】并发多线程教程

    18.一篇文章,从源码深入详解ThreadLocal内存泄漏问题 19.并发容器之BlockingQueue 20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解 21.线程池ThreadPoolExecutor实现原理 22.线程池之...

Global site tag (gtag.js) - Google Analytics