`
aty
  • 浏览: 35536 次
  • 性别: 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理解(一)使用和测试

    NULL 博文链接:https://aty.iteye.com/blog/1913734

    ThreadLocal_ThreadLocal源码分析_

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

    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...

    对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-...

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

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

    Android 详解ThreadLocal及InheritableThreadLocal

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

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

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

    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

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

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

    Java并发编程原理与实战

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

    java8源码-jdk8-code:jdk1.8

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

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

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

    java并发编程

    21:56分钟 | 第6节线程的初始化,中断以及其源码讲解00:21:26分钟 | 第7节多种创建线程的方式案例演示(一)带返回值的方式00:17:12分钟 | 第8节多种创建线程的方式案例演示(二)使用线程池00:15:40分钟 ...

    并发编程笔记20190526.docx

    二、JDK1.8中原理和实现 54 1、ConcurrentHashMap的数据结构 54 2、ConcurrentHashMap的初始化 55 3、Node链表和红黑树结构转换 56 4、ConcurrentHashMap的操作 57 三、JDK1.8实现与1.7相比的重大变化 59 四、 更多...

    龙果 java并发编程原理实战

    第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...

    Java 并发编程原理与实战视频

    第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...

Global site tag (gtag.js) - Google Analytics