ThreadLocal提供了线程局部 (thread-local) 变量,访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量(变量值的副本),它独立于变量的初始化副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。ThreadLocal 实例通常是类中的 private static 字段,每个线程都保持对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。
ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本,由于Key值不可重复,每一个“线程对象”对应线程的“变量副本”,而到达了线程安全。
protected T initialValue()返回该线程局部变量的当前线程的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的,ThreadLocal中的缺省实现直接返回一个null。线程第一次使用
get()
set(T)
initialValue
方法。通常,此方法对每个线程最多调用一次,但如果在调用get()
remove()
线程同步机制比较
ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。而ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。
当然ThreadLocal并不能替代同步机制,两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通信的有效方式;而ThreadLocal是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源(变量),这样当然不需要对多个线程进行同步了。所以,如果你需要进行多个线程之间进行通信,则使用同步机制;如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal,这将极大地简化你的程序,使程序更加易读、简洁。
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。
相关推荐
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
主要介绍了ThreadLocal使用案例分析,需要的朋友可以参考下
NULL 博文链接:https://xuranpaoche.iteye.com/blog/1514071
主要介绍了Android 中 ThreadLocal使用示例的相关资料,这里提供示例代码帮助大家学习理解这部分内容,需要的朋友可以参考下
ThreadLocalMap是ThreadLocal类中的内部类,实例却被Thread类持有,相当于每个线程持有一个map
主要为大家详细介绍了java ThreadLocal的使用案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。
主要介绍了深入理解ThreadLocal工作原理及使用示例,涉及ThreadLocal<T> 简介和使用示例及ThreadLocal的原理等相关内容,具有一定参考价值,需要的朋友可以了解下。
NULL 博文链接:https://justsee.iteye.com/blog/791919
ThreadLocal
javaee开发常见的模式有MVC模式,在C层中常常会再次分层,如:servlet(web层)、service(业务逻辑层)、dao(数据访问层),其中service和dao最容易混在一起,如转...所以,使用ThreadLocal可以解决这样的分层问题。
NULL 博文链接:https://bijian1013.iteye.com/blog/2380233
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
Java中ThreadLocal的设计与使用.doc
目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期...ThreadLocal使用demoThreadLocal源码探索ThreadLocal注意事项使用ThreadLocal解决SimpleDateFormat线程安全问题总结...
使用的技术主要包括:classlaoder,加密解密,线程,ThreadLocal使用,反射,IO操作,jdbc, 序列化,lambda表达式,字节码工程,正则表达式等。 代码流程: 1.使用指定加密算法生成秘钥。 2.使用秘钥和加密器对字节码...
ThreadLocal源码分析和使用
主要介绍了Java ThreadLocal用法,结合实例形式详细分析了ThreadLocal线程局部变量相关原理、定义与使用方法,需要的朋友可以参考下