java中的ThreadLocal

ThreadLocal一般用来保存多个线程对共享变量的修改使得每个线程都能访问自己修改后的变量值。以前我对ThreadLocal的粗略印象就是它是一个map<线程,该线程对共享变量值>,具体是不是这样,怎样实现的并不清楚。遇到概念比较模糊的知识点,只有去搞懂,才能有所进步,所以下面分析一下;

一 应用:

//用ThreadLocal声明一个共享的变量

//普通类中的实例变量

1.1 测试带ThreadLocal的共享变量

结果:

1.2测试普通的共享变量

结果:

分析:

在1.1和1.2,分别把一个拥有ThreadLocal变量的对象和一个普通变量的对象传个多个线程,然后修改对象中的值。1.1中每个线程所做的修改都能被记录下来,而1.2中每个线程由于共享一个对象中的变量,由于并发的原因只会记录其中的一个值。ThreadLocal的确会记录每个线程对共享变量的修改。

二 源码

ThreadLocal的类图:

类中各实例变量:

final int threadLocalHashCode:用来唯一标识ThreadLocal对象的hashcode,通过该变量与对象数组中的length-1进行与操作,获取保存的对象的位置。

static AtomicInteger nextHashCode: 用来生成唯一hashcode

static final int HASH_INCREMENT: 每次新生成一个hashcode的增量

类中方法:set和get

getMap(Thread t):根据线程t获取线程的ThreadLocal.ThreadLocalMap threadLocals,ThreadLocalMap有点类似hash table,用来存储不同ThreadLocal对象所对应的值,一个线程可以存储通过多个不同的ThreadLocal操作所存储的值。

createMap(Thread t, T firstValue):创建线程t的ThreadLocalMap,并保存该ThreadLocal对象所对应的值为firstValue。

setInitialValue(): 创建该线程的ThreadLocal.ThreadLocalMap,取initialValue()初始化的值,如果map 为空则创建ThreadLocalMap并保存初始值,如果map不为空则直接替换ThreadLocalMap中该ThreadLocal对象所对应的值为初始值,最后返回初始值。

三流程

ThreadLocal存储多个线程操作值的过程如下:每个线程下都会有创建一个ThreadLocalMap,该map中保存了不同ThreadLocal所保存的值,通过操作ThreadLocalMap获取该线程下ThreadLocal对象所对应的值。ThreadLocalMap中保存对象用的是Entry,它继承了虚引用WeakReference,接下来了解一下虚引用。

原文地址:https://www.cnblogs.com/wagne/p/8496024.html

时间: 2024-10-27 18:26:29

java中的ThreadLocal的相关文章

Java中的ThreadLocal详解

一.ThreadLocal简介 多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性.ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题. ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一乐Threa

谈谈Java中的ThreadLocal

什么是ThreadLocal ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本.通过ThreadLocal可以将对象的可见范围限制在同一个线程内. 跳出误区 需要重点强调的的是,不要拿ThreadLocal和synchronized做类比,因为这种比较压根就是无意义的!sysnchronized是一种互斥同步机制,是为了保证在多线程环境下对于共享资源的正确访问.而ThreadLocal从本质上讲,无非是提供了一个"

理解java中的ThreadLocal(转)

一.对ThreadLocal概术 JDK API 写道: 该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本.ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联. 二.结合源码理解 可以看到ThreadLocal类中的变量只有这3个int型: private f

java 中的 ThreadLocal

首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的.各个线程中访问的是不同的对象. 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本.通 过ThreadLocal.set()将这个新创

Java中线程封闭之ThreadLocal

在访问共享数据时通常使用同步.若不使用同步则可以将对象封闭在一个线程中达到线程安全的目的,该方法称为线程封闭(Thread Confinement).其中实现线程封闭中规范的方法是使用ThreadLocal类.线程封闭技术一种常用的使用场景是在JDBC Connection对象. public class ConnectionHelper{private final static String URL = "";private final static ThreadLocal<C

帮助理解Java中ThreadLocal的一篇文章

原文地址:http://www.ahlinux.com/java/20332.html 并发编程中,一个重要的内容是数据共享.当你创建了实现Runnable接口的线程,然后开启使用相同Runnable实例的各种Thread对象,所有的线程便共享定义在Runnable对象中的属性.也就是说,当你在一个线程中改变任意属性时,所有的线程都会因此受到影响,同时会看到第一个线程修改后的值.有时我们希望如此,比如:多个线程增大或减小同一个计数器变量:但是,有时我们希望确保每个线程,只能工作在它自己的线程实例

JAVA学习篇--ThreadLocal,Java中特殊的线程绑定机制

在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个connection连接).那么ThreadLocal是如果做到的呢?它和同步锁的不同在哪里? 是什么: 对于ThreadLocal看英文单词我们很容易理解为一个线程的本地实现,但是它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLoc

Java中ThreadLocal无锁化线程封闭实现原理

虽然现在可以说很多程序员会用ThreadLocal,但是我相信大多数程序员还不知道ThreadLocal,而使用ThreadLocal的程序员大多只是知道其然而不知其所以然,因此,使用ThreadLocal的程序员很多时候会被它导入到陷进中去,其实java很多高级机制系列的很多东西都是一把双刃剑,也就是有利必有其弊,那么我们的方法是找到利和弊的中间平衡点,最佳的方式去解决问题. 本文首先说明ThreadLocal能做什么,然后根据功能为什么要用它,如何使用它,最后通过内部说明讲解他的坑在哪里,使

java中的引用与ThreadLocal

ThreadLocal 前几天看了@华为kim的threadlocal的博文深有感触,所有在这再次总结一下我对threadlocal的源码理解,以及内部机制. 数据结构 下面看一下threadlocal的数据结构:每一个Thread内部都有一个 ThreadLocal.ThreadLocalMap threadLocals 对象 , 而ThreadLocalMap 中,维护着一个Entry[]数组,每个Entry对象,包含一个弱引用的ThreadLocal和一个value. 内部机制 SET操作