ThreadLocal 实例相当于线程私有变量的容器,为每个访问线程存储了一个对应的变量值,做到了线程访问的隔离性。功能类似于洗澡间的衣柜,每个线程相当于一个人,每个柜子相当于私有变量。每个人都有洗澡间的一个柜子,这个柜子只能本人使用,别人不能使用。ThreadLocal类将每个线程实例和变量以K-V方式存储了下来,这样在每个线程访问get方法的时候,从Map中查询对应的Value信息返回。 ThreadLocal实例通常是类的私有静态字段,例如想访问与线程相关的状态,如用户ID或事务ID的信息。
在JDK的源码里,还举了一个例子来说明ThreadLocal的使用,场景是要给每个不同的线程生成不同的序列号,序列号分配后以后再调用保持不变。 私有静态 ThreadLocal 实例(serialNum )为调用该类的静态 SerialNum.get() 方法的每个线程维护了一个“序列号”,该方法将返回当前线程的序列号。(线程的序列号是在第一次调用 SerialNum.get() 时分配的,并在后续调用中不会更改。)
/** * 生成序列号:使用方法--调用SerialNum.get() * 私有静态 ThreadLocal 实例(serialNum)为调用该类的静态 SerialNum.get() 方法的每个线程维护了一个“序列号”, * 该方法将返回当前线程的序列号。(线程的序列号是在第一次调用 SerialNum.get() 时分配的,并在后续调用中不会更改。) * 2009-12-4 */ public class SerialNum { // The next serial number to be assigned private static int nextSerialNum = 0; private static ThreadLocal serialNum = new ThreadLocal() { protected synchronized Object initialValue() { return new Integer(nextSerialNum++); } }; public static int get() { return ((Integer) (serialNum.get())).intValue(); } }
每一个线程都持有 一个对其线程局部变量副本的隐式引用 ,只要线程是活动的而且 ThreadLocal 实例是可 访问的;线程消失后,所有线程局部实例的副本都会被垃圾回收( 除非存在对这些副本的其他引用 )。
在threadLocal的使用中,initialValue()用来初始化一个对象,然后使用get()可以返回这个对象,通过对这个对象的操作如存储等功能来使用threadLocal。
Thread与ThreadLocal之间的关系,我们不妨设想一下城市的公交系统:
城市中的各条公交线路就好像我们系统中的那一个个线程,在各条公交线路上,会有相应的公交车辆, 这些公交车辆就好像Thread的threadLocals,用来运送特定于该条线路的乘客(数据资源)。 为了乘客可以乘车或者下车,各条公交线路沿线都会设置多个乘车点(Bus stop),而这些乘车点实际上就是ThreadLocal。 虽然同一个乘车点可能会有多条公交线路共用,但同一时间,乘客只会搭乘他要乘坐并且当前经过的公交车。这与ThreadLocal和Thread的关系是类似的, 同一个ThreadLocal虽然可以为多个线程指定数据资源,但只会将数据资源指定到当前的线程。
所以,ThreadLocal的生命周期是线程级别,是依赖于线程的,这点需要明确。
相关推荐
适合人群:具备一定Java基础,特别是对并发编程有一定认识的研发人员或进阶程序员。 使用场景及目标:主要用于理解和解决在高并发环境下线程安全问题的方法和技术。通过本文的学习,能够掌握ThreadLocal的基本用法...
理解ThreadLocal的关键在于认识到它是线程局部的,每个线程都有自己的独立副本,而不是所有线程共享一个全局变量。这使得ThreadLocal成为在多线程环境下维护线程安全状态的一种有效手段,尤其在处理如Handler、...
题目起的有些拗口了,简单说,这篇文章想要解释Spring为什么会选择使用ThreadLocal将资源和事务绑定到线程上,这背后有着什么样的起因和设计动机,通过分析帮助大家更清晰地认识Spring的线程绑定机制。访问任何带有...
- **架构基础**:书中首先介绍了J2EE工程的通用架构,包括了分层结构和组件交互原则,为读者建立起对Web应用架构的初步认识。 #### Apache与Tomcat整合 - **Web服务器与应用服务器**:介绍了Apache HTTP服务器与...
│ │ 01 认识线程.mp4 │ │ 02 线程和进程的关系.mp4 │ │ 03 并发和并行的区别.mp4 │ │ 04 并发编程的应用场景和风险.mp4 │ │ │ ├─02 线程的启动和终止 │ │ 01 线程的启动一:继承Thread类.mp4 ...
│ │ 01 认识线程.mp4 │ │ 02 线程和进程的关系.mp4 │ │ 03 并发和并行的区别.mp4 │ │ 04 并发编程的应用场景和风险.mp4 │ │ │ ├─02 线程的启动和终止 │ │ 01 线程的启动一:继承Thread类.mp4 ...
│ │ 01 认识线程.mp4 │ │ 02 线程和进程的关系.mp4 │ │ 03 并发和并行的区别.mp4 │ │ 04 并发编程的应用场景和风险.mp4 │ │ │ ├─02 线程的启动和终止 │ │ 01 线程的启动一:继承Thread类.mp4 ...
│ │ 01 认识线程.mp4 │ │ 02 线程和进程的关系.mp4 │ │ 03 并发和并行的区别.mp4 │ │ 04 并发编程的应用场景和风险.mp4 │ │ │ ├─02 线程的启动和终止 │ │ 01 线程的启动一:继承Thread类.mp4 ...
ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析....
- **并发编程**:了解线程的创建、同步机制,熟悉synchronized、volatile、ThreadLocal等概念。 - **集合框架**:深入理解List、Set、Map接口及其实现类,如ArrayList、LinkedList、HashMap、TreeMap等的内部工作...
- 认识到找工作是一种缘分和概率事件,即使基础扎实也可能面临挫折,但多尝试可以提高成功率。 - 不要害怕面试,失败是成功的垫脚石,多面试可以提升面试技巧。 - 保持积极态度,对工作要有追求,理解读书的意义...
并发运算1.10 Linux和Windows对于并发采取的不同机制第2章认识Java里面的线程2.1先来看一下线程的简单实现三种方法2.2线程里面的属性和方法2.3关于线程的中断机制2.4螺纹的生命周期2.5什么是守护线程2.6线程组2.7...
书中的反模式是通过对实践中出现问题的总结,提炼出的不良设计或编程习惯,通过分析这些反模式,我们可以更清晰地认识到问题的本质,从而采取正确的解决方案。 Java反模式涵盖了许多主题,包括对象设计、类设计、...
实例中可能涵盖常见线程安全问题,如数据竞争、死锁、活锁和饥饿,以及如何通过使用volatile、Atomic变量、线程局部变量(ThreadLocal)等手段来解决这些问题。 六、线程中断与异常处理 Java的Thread类提供了...
1.1 认识Spring 1.2 关于SpringSource 1.3 Spring带给我们什么 1.4 Spring体系结构 1.5 Spring 3.0的新功能 1.5.1 核心API更新到Java 5. 1.5.2 Spring表达式语言 1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型...
1.1 认识Spring 1.2 关于SpringSource 1.3 Spring带给我们什么 1.4 Spring体系结构 1.5 Spring 3.0的新功能 1.5.1 核心API更新到Java 5. 1.5.2 Spring表达式语言 1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型...
2. **并发编程**:面试中涉及到的并发知识包括ThreadLocal、可迭代ThreadLocals、锁(如synchronized、Lock)、并发容器(如HashMap在1.7和1.8的实现差异、AQS-AbstractQueuedSynchronizer)以及同步工具类(如...
源码中可能涉及volatile、final以及ThreadLocal等特性,帮助我们理解JMM的工作原理和并发设计的底层逻辑。 通过对马士兵老师的高并发Java架构预习课程源码的深入学习,我们可以掌握多线程编程的核心技能,理解并发...