`

Java并发编程-ThreadLocal原理

 
阅读更多
大半夜的研究了一下ThreadLocal,头脑不是特别清醒,如果疑问,欢迎探讨啊。
核心
Thread 类中有  ThreadLocal.ThreadLocalMap threadLocals = null; 变量

ThreadLocalMap类主要代码:
一个弱引用的内部类
static class Entry extends WeakReference<ThreadLocal> {
            /** The value associated with this ThreadLocal. */
      Object value;

      Entry(ThreadLocal k, Object v) {
          super(k);
          value = v;
      }
 }

构造方法
 ThreadLocalMap(ThreadLocal firstKey, Object firstValue) {
     table = new Entry[INITIAL_CAPACITY];
     int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
     table[i] = new Entry(firstKey, firstValue);
     size = 1;
      setThreshold(INITIAL_CAPACITY);
}

private Entry getEntry(ThreadLocal key) {
      int i = key.threadLocalHashCode & (table.length - 1);
      Entry e = table[i];
      if (e != null && e.get() == key)
          return e;
      else
      return getEntryAfterMiss(key, i, e);
 }

ThreadLocal 类中
再看一下如何往ThreadLocal中存取数据:
 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();
    }

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

void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
}

在第一次存数据的时候,由于当前线程的threadLocals为null,所以会根据当前线程的ThreadLocal对象【该对象一般设计为静态常量】,以及实际要存放的值,创建一个ThreadLocalMap,并将其赋给Thread类中的threadLocals变量,也就是将Thread类中的threadLocals变量给初始化了。

在取数据的时候,也是要根据当前线程取得自己的ThreadLocalMap,然后通过ThreadLocal对象【跟创建时使用的对象是同一个】取得相应的值。


几点说明:
1、在使用过程中,最核心的应该是ThreadLocalMap。随线程的增减,变化的也是ThreadLocalMap。
2、ThreadLocalMap中数据的存放是以程序中声明的Threadlocal对象为key,实际需要值为value进行存放的。一般Key都是常量的,这也是为什么程序中ThreadLocal对象一般声明为静态常量的原因。
3、如果Threadlocal不设计为静态常量,那么会有什么后果呢?
对每个线程都会创建的是ThreadLocalMap对象。每个程序中定义的ThreadLocal对象对应着ThreadLocalMap对象的key。如果Threadlocal不为常量,那么服务器在运行过程中,ThreadLocal对象的数量为应用中存在的线程数【假如一个线程对应一个Threadlocal】。

讨论:
既然在使用过程中起核心作用的是ThreadLocalMap,那么为什么不直接在Thread类中实现这个Map呢?
个人观点是从软件设计的角度来考虑的。因为如果写到Thread里面,那么Thread中的功能太多,造成功能的耦合性太强,简单说就是 Thread本身就应该只有 start(),stop(),run()等自己的行为,而不应该包含其他不属于它的工作。


写的有点乱,没有好好的组织一下思路。




分享到:
评论

相关推荐

    java并发编程-从入门到精通

    总之,“java并发编程-从入门到精通”这个文档会覆盖以上所有内容,并可能深入讲解更多高级主题,如原子类(Atomic*)、线程局部变量(ThreadLocal)、中断线程机制以及死锁预防等。通过学习这份文档,你将能够熟练...

    Java并发编程中ThreadLocal的原理与应用分析

    适合人群:具备一定Java基础,特别是对并发编程有一定认识的研发人员或进阶程序员。 使用场景及目标:主要用于理解和解决在高并发环境下线程安全问题的方法和技术。通过本文的学习,能够掌握ThreadLocal的基本用法...

    java并发编程实战源码,java并发编程实战pdf,Java

    《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...

    Java并发编程-线程安全与基础构建模块

    本文将深入探讨"Java并发编程-线程安全与基础构建模块"这一主题,旨在帮助开发者理解如何有效地处理并发问题,提高程序性能和稳定性。 首先,线程安全是并发编程中的核心概念,指的是多个线程访问同一资源时,无论...

    java事务 - threadlocal

    Java事务和ThreadLocal是两种在Java编程中至关重要的概念,它们分别用于处理多线程环境下的数据一致性问题和提供线程局部变量。 首先,我们来深入理解Java事务。在数据库操作中,事务是一系列操作的集合,这些操作...

    JAVA并发编程实践-中文-高清-带书签-完整版

    《JAVA并发编程实践》是一本深入探讨Java多线程编程技术的专业书籍,旨在帮助开发者理解和掌握在Java平台上进行高效并发编程的关键知识。本书涵盖了从基本概念到高级特性的全面内容,是Java程序员进阶的必读之作。 ...

    java并发编程书籍

    Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...

    Java并发编程实践.pdf

    ### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 ...通过上述知识点的学习,我们可以更好地理解和掌握Java并发编程的基本原理和技巧,为开发高效稳定的并发应用程序打下坚实的基础。

    java并发编程

    Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...

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

    Java并发编程学习之ThreadLocal源码详析 ThreadLocal是Java并发编程中的一种机制,用于解决多线程访问共享变量的问题。它可以使每个线程对共享变量的访问都是线程安全的,使得多线程编程变得更加简单。 ...

    JAVA并发编程实践

    根据给定文件的信息“JAVA并发编程实践”以及其描述为“Java并发学习资料”,我们可以从中提炼出关于Java并发编程的一些核心知识点。Java并发编程是Java高级特性之一,它允许开发者编写能够同时执行多个任务的程序,...

    Java并发编程实战

    3.3.3 ThreadLocal类 3.4 不变性 3.4.1 Final域 3.4.2 示例:使用Volatile类型来发布不可变对象 3.5 安全发布 3.5.1 不正确的发布:正确的对象被破坏 3.5.2 不可变对象与初始化安全性 3.5.3 安全发布的常用...

    java并发编程艺术

    《Java并发编程艺术》这本书是Java开发者深入理解多线程编程的重要参考资料。它全面而深入地探讨了Java平台上的并发编程技术,对于提升程序性能、优化系统资源利用以及解决多线程环境中的复杂问题有着极大的帮助。...

    Java并发编程学习笔记

    Java并发编程是指在Java语言中编写多线程和多任务执行的程序,以便更高效地利用计算机的多核处理器资源。并发编程是Java高级编程技能中的重要组成部分,尤其是在需要处理大量数据、提供快速响应、实现高吞吐量和高可...

    java并发编程经典书籍(英文版)

    Java并发编程是Java开发者必须掌握的关键技能之一,尤其是在多核处理器和分布式系统广泛使用的今天。以下是对标题和描述中提及的两本经典书籍——《Concurrent Programming in Java》和《Java Concurrency in ...

    龙果 java并发编程原理实战

    龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...

    JAVA并发-自问自答学ThreadLocal.pdf

    在Java的并发编程中,ThreadLocal是一个非常重要的概念,它可以帮助我们创建独立于线程的变量副本,避免了在多线程共享数据时可能出现的竞态条件。 1. **ThreadLocal的工作原理**: - 每个ThreadLocal实例都会为每...

    Java并发编程实践-电子书-02章

    ### Java并发编程实践:构建线程安全应用程序 #### 2.1 什么是线程安全性? 在探讨线程安全性的概念时,我们首先要理解为何在多线程环境下,线程安全性至关重要。在一个复杂对象上进行操作时,从操作开始至完成,...

Global site tag (gtag.js) - Google Analytics