• 特点
ThreadLocal和Sychronized都用于解决多线程间的并发访问,但它们实现的本质方法不同:sychronized利用锁使同一个代码块或变量在某时刻只能被一个线程访问,而ThreadLocal则为所有线程都提供一个变量副本,这样在某一时刻不同线程访问到的是本质上不同的变量。
ThreadLocal的底层是一个TMap(ThreadLocalMap),向ThreadLocal中存东西相当于向TMap中存东西.
存东西:(当前线程id,TMap)->得到TMap->TMap(当先线程id,保存的值),从当前线程id获取TMap,得到TMap之后, 往TMap里面存值
ThreadLocalMap tmap=getMap(Thread.currentThread());//(当前线程id,TMap)
tmap.set(this,value);//(当先线程id,保存的值)
 
取东西:(当前线程id,TMap)->得到TMap->TMap(当先线程id,保存的值),从当前线程id获取TMap,得到TMap之后,从TMap里面取值
ThreadLocalMap tmap=getMap(Thread.currentThread());//(当前线程id,TMap)
ThreadLocalMap.Entry entry=tmap.getEntry(this);//(当先线程id,保存的值)
Object ob=entry.value;//(当先线程id,保存的值)
 
  • 使用场景:数据库连接、session管理、父子线程共享线程变量(我使用过的token)
  1. 数据库连接

测试:

主线程中定义static型的ThreadLocal,上面代码中每个线程第一次获取connection时,都会往ThreadLocal中存一份自己的connection,往后直接用就可以了
 
  • 注意事项:内存泄漏、造成脏数据
(1)内存泄漏:TMap(当先线程id,保存的值)中的key为ThreadLocal弱引用,在系统GC的时候,若没有强引用去引用这个弱引用,这个弱引用就会被回收掉,则key就会变为null,这样TMap中就会出现key为null的Entry,也就不能访问到key为null的Entry对应的value,此时若线程迟迟不结束(使用static型ThreadLocal时,生命周期不会随线程结束而结束),则key为null的Entry对应的value永远无法访问,造成内存泄漏。
解决方法:在不同线程的TMap中清除key=null的value
(2)脏数据:线程池会复用Thread对象,故而Thread对象中的static静态属性ThreadLocal也会被复用,所以需要显示调用remove()清理掉静态属性ThreadLocal的信息,否则若下一个复用的线程若不调用set()设置该线程初始值,而直接调用get()就会获取到它前一个线程设置的值

谈谈ThreadLocal的应用场景和注意事项?的更多相关文章

  1. 面试官:ThreadLocal的应用场景和注意事项有哪些?

    前言 ThreadLocal主要有如下2个作用 保证线程安全 在线程级别传递变量 保证线程安全 最近一个小伙伴把项目中封装的日期工具类用在多线程环境下居然出了问题,来看看怎么回事吧 日期转换的一个工具 ...

  2. JSON的使用场景及注意事项介绍

    上篇我们讲解了JSON的诞生原因是因为XML整合到HTML中各个浏览器实现的细节不尽相同,所以道格拉斯·克罗克福特(Douglas Crockford) 和 奇普·莫宁斯达(Chip Mornings ...

  3. ThreadLocal的使用场景分析

    目录 一.ThreadLocal介绍 二.使用场景1——数据库事务问题 2.1 问题背景 2.2 方案1-修改接口传参 2.3 方案2-使用ThreadLocal 三.使用场景2——日志追踪问题 四. ...

  4. 谈谈ThreadLocal的设计及不足

    用Java语言开发的同学对 ThreadLocal 应该都不会陌生,这个类的使用场景很多,特别是在一些框架中经常用到,比如数据库事务操作,还有MVC框架中数据跨层传递.这里我们简要探讨下 Thread ...

  5. ThreadLocal的使用场景及实现原理

    1. 什么是ThreadLocal? 线程局部变量(通常,ThreadLocal变量是private static修饰的,此时ThreadLocal变量相当于成为了线程内部的全局变量) 2. 使用场景 ...

  6. ThreadLocal的使用场景:Web容器、Spring容器、日志打印

    一.对于HTTP事务的理解 一次HTTP请求,就是一个事务.事务者,必须完整的执行其中的所有步骤,不能中断. 二.HTTP事务的隔离 每次HTTP请求对应一个HTTP事务,而每个请求都对应一个线程,线 ...

  7. 客户端相关知识学习(一)之混合开发,为什么要在App中使用H5页面以及应用场景、注意事项

    混合开发 随着移动互联网的高速发展,常规的开发速度已经渐渐不能满足市场需求.原生H5混合开发应运而生,目前,市场上许多主流应用都有用到混合开发,例如支付宝.美团等.下面,结合我本人的开发经验,简单谈一 ...

  8. tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项

    linux TIME_WAIT 相关参数: net.ipv4.tcp_tw_reuse = 表示开启重用.允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭 net.i ...

  9. 微信小程序节点查询方法:wx.createSelectorQuery()的使用场景与注意事项

    小程序由于内置于微信,这使得它有了得天独厚的宣传和使用优势,本着学习的心态,我在官网上看了一遍开发文档,大致得出小程序框架的设计模式与使用注意事项(重点来了,其实开发文档某些方面叙述的并不仔细,甚至存 ...

随机推荐

  1. 基于JDK的动态代理原理分析

    基于JDK的动态代理原理分析 这篇文章解决三个问题: What 动态代理是什么 How 动态代理怎么用 Why 动态代理的原理 动态代理是什么? 动态代理是代理模式的一种具体实现,是指在程序运行期间, ...

  2. HTTP1.0和HTTP1.1和HTTP2.0的区别

    1 HTTP1.0和HTTP1.1的区别1.1 长连接(Persistent Connection)       HTTP1.1支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求 ...

  3. Pipeline 有什么好处,为什么要用 pipeline?

    答:可以将多次 IO 往返的时间缩减为一次,前提是 pipeline 执行的指令之间没有 因果相关性.使用 redis-benchmark 进行压测的时候可以发现影响 redis 的 QPS 峰值的一 ...

  4. Hystrix相关注解?

    @EnableHystrix:开启熔断 @HystrixCommand(fallbackMethod="XXX"):声明一个失败回滚处理函数XXX,当被注解的方法执行超时(默认是 ...

  5. elasticsearch 的倒排索引是什么 ?

    面试官:想了解你对基础概念的认知. 解答:通俗解释一下就可以. 传统的我们的检索是通过文章,逐个遍历找到对应关键词的位置. 而倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典+映射表 即 ...

  6. Zookeeper 保证了如下分布式一致性特性?

    1.顺序一致性 2.原子性 3.单一视图 4.可靠性 5.实时性(最终一致性) 客户端的读请求可以被集群中的任意一台机器处理,如果读请求在节点上注册了 监听器,这个监听器也是由所连接的 zookeep ...

  7. 学习RabbitMQ(三)

    1 用户注册后(会立即提示注册成功),过一会发送短信和邮件通知 发布/订阅模型 以上模式一般是用户注册成功后,写入一条数据到mysql,在发送一条消息到MQ! 如果不用消息中间件(或者简单的做成异步发 ...

  8. 项目启动的缓慢之“Build completed with 1 error and 18 warnings in 3 m 51 s”

    一.问题 idea编译项目writing classes很慢,等很久之后项目也启动不起来,如下图 二.解决方案 1.File->Invalidate Caches/Restart...清下缓存 ...

  9. CommonsCollection3

    CommonsCollection3 1.前置知识 CommonsCollection3其实就是cc1和cc2的组合,不用再学那么多知识了,再学习另两个生面孔类 1.1.InstantiateTran ...

  10. 220v-5v稳压电路

    5V整流电路原理 先对电路进行整流 整流电路:利用单向导电器件将交流电转换成脉动直流电路,再用电容进行滤波 滤波电路:利用储能元件(电感或电容)把脉动直流电转换成比较平坦的直流电,然后对电路进行稳压 ...