`
geeksun
  • 浏览: 954016 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

认识ThreadLocal

阅读更多

        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的生命周期是线程级别,是依赖于线程的,这点需要明确。 

 

  • 大小: 14 KB
分享到:
评论

相关推荐

    Spring基于ThreadLocal的“资源-事务”线程绑定设计的缘起

    题目起的有些拗口了,简单说,这篇文章想要解释Spring为什么会选择使用ThreadLocal将资源和事务绑定到线程上,这背后有着什么样的起因和设计动机,通过分析帮助大家更清晰地认识Spring的线程绑定机制。访问任何带有...

    并发编程笔记20190526.docx

    2. ThreadLocal辨析 11 3. 线程间的协作 19 4. 面试题 21 第二章 线程的并发工具类 21 一、 Fork/Join框架的介绍 21 1、实现步骤: 22 2、工作窃取算法 22 3、分而治之 23 4、Fork/Join使用的标准范式 24 5、Fork/...

    Java并发编程原理与实战

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

    java-concurrent-source:Java多并发编程从入门到精通源码-源码通

    并发运算1.10 Linux和Windows对于并发采取的不同机制第2章认识Java里面的线程2.1先来看一下线程的简单实现三种方法2.2线程里面的属性和方法2.3关于线程的中断机制2.4螺纹的生命周期2.5什么是守护线程2.6线程组2.7...

    Spring.3.x企业应用开发实战(完整版).part2

    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 通用类型...

    Spring3.x企业应用开发实战(完整版) part1

    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 通用类型...

    龙果 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节...

    龙果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节...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段19讲、结合jconsole,jstack以及汇编指令认识synchronized关键字.mp4 │ 高并发编程第一阶段20讲、同步代码块以及同步方法之间的区别和关系.mp4 │ 高并发编程第一阶段21讲、通过实验分析...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段19讲、结合jconsole,jstack以及汇编指令认识synchronized关键字.mp4 │ 高并发编程第一阶段20讲、同步代码块以及同步方法之间的区别和关系.mp4 │ 高并发编程第一阶段21讲、通过实验分析...

Global site tag (gtag.js) - Google Analytics