Java——ThreadLocal的使用

概述

ThreadLocal:依附在线程上的变量的媒介。在每一个Thread类中都有一个ThreadLocalMap的实例,源码中是这样体现的
  /* ThreadLocal values pertaining to this thread. This map is maintained
   * by the ThreadLocal class.
   */
    ThreadLocal.ThreadLocalMap threadLocals = null;
  ThreadLocalMap是以ThreadLocal对象为键,任意对象为值的Map.通过ThreadLocal类中的 get,set,initialValue方法可以获取,设置,初始化:依靠ThreadLocal类作为媒介依附在线程上的任意对象。

使用场景

一个对象功能的施展需要依赖于一个线程:如唯一标示一个线程,用来调试并发执行的程序哪个线程出现了问题;或者用来追踪多线程环境下每一个线程的执行轨迹。在数据库中,一个事务可能会重复的拿同一个锁,以及维护自身的SavePoint,以便回滚的时候使用到。实际上一个事务就对应着一个线程,通过ThreaLocald把事务的实现类依附在线程上,这样就方便处理锁的缓存,事务回滚,日志记录等问题了。

例子

用ThreadLocal实现CLH锁的时候用到
?spm=5176.8091938.0.0.fRxoE5

时间: 2024-09-19 23:54:57

Java——ThreadLocal的使用的相关文章

Java ThreadLocal 使用详解

引言 ThreadLocal的官方API解释为: "该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副 本.ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联." 大概的意思有两点: ThreadLocal提供了一种访问某个变量的特殊方式:访问到的变量属

[Java] ThreadLocal的使用规则和源码分析

版权声明:请尊重个人劳动成果,转载注明出处,谢谢!http://blog.csdn.net/amazing7/article/details/51313851 目录(?)[+] ThreadLocal是什么? 线程局部变量,访问某个变量的每个线程都有自己的局部变量,它独立于变量的初始化副本.     它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.从线程的角度看,就好像每一个线程都完全拥有该变量.    

Java ThreadLocal的使用

原文链接  作者: Jakob Jenkov 译者: 林威建[weakielin@gmail.com] Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量.因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量. 如何创建ThreadLocal变量 以下代码展示了如何创建一个ThreadLocal变量: private ThreadLocal myThreadLocal = new Thr

关于Java ThreadLocal的疑问

问题描述 ThreadLocal作为一个可以将数据进行线程隔离的解决方法,其本质还是将数据存放在各个线程对象中(数据存放在Thread的ThreadLocalMap threadLocals中):那么为什么JDK不在设计的时候就使Thread对象具有保存线程上下文的能力呢?比如可以这样:public class Thread{...private Map<Object,Object> contexts = new WeakHashMap<Object,Object>();publi

Java ThreadLocal 线程安全问题解决方案_java

一.线程安全问题产生的原因 线程安全问题都是由全局变量及静态变量引起的 二.线程安全问题 SimpleDateFormate sdf = new SimpleDateFormat();使用sdf.parse(dateStr);sdf.format(date);在sdf内有一个对Caleadar对象的引用,在源码sdf.parse(dateStr);源码中calendar.clear();和calendar.getTime(); // 获取calendar的时间 如果 线程A 调用了 sdf.pa

Java——ThreadLocal类

一,引入ThreadLocal /*测试ThreadLocal对象 * ThreadLocal:这个类提供了一个线程本地的变量. * 这些变量在被共享访问的情况下在不同的线程里是独立的 ( 必须通过 get 和 set 方法来访问 ) . * 很显然该类提供了一个机制可以防止多线程访问带来的不安全机制.实际上就是在线程本地保存一个变量, * 而不是通过共享变量.这个就要看我们的使用场合了,如果我们确实需要共享的数据,那还是必须通过同步机制来保证数据的安全. * 如果有些情况希望不同的线程保存的变

Java多线程之ThreadLocal

ThreadLocal的核心思想很简单:为每个独立的线程提供一个变量的副本. Java提供的synchronized关键字使用了"同步锁"的机制来阻止线程的竞争访问,即"以时间换空间".: " 10pt; FONT-SIZE:> ThreadLocal则使用了"拷贝副本"的方式,人人有份,你用你的,我用我的,大家互不影响,是"以空间换时间".每个线程修改变量时,实际上修改的是变量的副本,不怕影响到其它线程. 为

Java 中ThreadLocal类详解_java

ThreadLocal类,代表一个线程局部变量,通过把数据放在ThreadLocal中,可以让每个线程创建一个该变量的副本.也可以看成是线程同步的另一种方式吧,通过为每个线程创建一个变量的线程本地副本,从而避免并发线程同时读写同一个变量资源时的冲突. 示例如下: import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import ja

ThreadLocal源码分析

ThreadLocal的作用 Java对象是线程间共享的,但有时我们需要一些线程间隔离的对象,该对象只能由同一个线程读写,对其他线程不可见.ThreadLocal正式提供了这样的机制,详细使用方式请参考Java ThreadLocal. ThreadLocal实现原理 自定义实现 在没有看源码前,如果我自己实现一个ThreadLocal,可能是这样的 public class ThreadLocal<T> { private Map<Thread, T> values = new