关于ThreadLocal

作者: From64KB | 来源:发表于2020-10-29 14:53 被阅读0次
先从一个案例开始入手: image.png

有这样一个场景,多个线程查询用户的出生日期,其中birthDate(int userId)会将用户的出生日期格式化后返回。注意一个问题,就是每次调用birthDate(int userId)就会生成一个 SimpleDateFormat对象,这显然是没有必要的。那么这样呢?

image.png
所有的线程都使用同一个 SimpleDateFormat对象,这样又会遇到一个问题, SimpleDateFormat对象并不是一个线程安全的对象,这样是线程不安全的。如果是使用线程锁限制线程访问,这样又会影响运行速度。那么最理想的情况应该是每个线程只有一个SimpleDateFormat对象 既解决了生成过多对象占用内存的问题,又能解决多线程线程锁带来的性能问题。这就引入了ThreadLocal
image.png
通过上图的代码,就可以保证,每个线程只有一个 SimpleDateFormat对象,解决了生成过多对象占用内存的问题,又能解决多线程线程锁带来的性能问题

再来讲另外一个ThreadLocal的案例:

image.png

有一个request需要通过四个Service才能完成,每个Service都需要包含用户信息的对象User,那么就需要把User对象从Service-1一直传递到Service-4,如果不想这样传来传去,怎么办?解决的方案还是ThreadLocal,可以把User对象保存在ThreadLocal中,在需要的地方取出来就行。请求结束后,清空即可ThreadLocal.remove()

image.png

这样ThreadLocal的初步使用案例就介绍到这里。如果是从事后台开发,Spring源码中有很多使用ThreadLocal的地方,例如:

image.png
至于从事Android开发那就更绕不开这个类了,Looper就是基于ThreadLocal实现的。

相关文章

  • 死磕源码系列 - ThreadLocal

    关于 ThreadLocal 先问几个问题 ThreadLocal 基于什么场景下使用? ThreadLocal ...

  • Handler消息机制

    ThreadLocal ThreadLocal是一个关于创建线程局部变量的类。使用ThreadLocal创建的变量...

  • Android关于ThreadLocal的思考和总结

    前言 Handler机制引出ThreadLocal 关于ThreadLocal的分析,首先得从Android的消息...

  • 关于ThreadLocal

    先从一个案例开始入手: 有这样一个场景,多个线程查询用户的出生日期,其中birthDate(int userId)...

  • ThreadLocal小结-到底会不会引起内存泄露

    [TOC] 1. ThreadLocal简介 网上看到一些文章,提到关于ThreadLocal可能引起的内存泄露,...

  • ThreadLocal 原理

    总述 ThreadLocal 在面试中经常提到,关于ThreadLocal使用不当造成OOM以及在特殊场景下,通过...

  • ThreadLocal

    ThreadLocal## 关于创建线程局部变量的一个类在Thread中有这么一个成员变量 ThreadLocal...

  • ThreadLocal

    关于ThreadLocal请参考这篇文章 解密ThreadLocal, 基本上都全了.这里主要是写一些自己的理解 ...

  • ThreadLocal

    ThreadLocal是一个关于创建线程局部变量的类。使用ThreadLocal创建的变量是线程隔离的,其他线程则...

  • Java并发编程之ThreadLocal详解

    ThreadLocal是什么? ThreadLocal是一个关于创建线程局部变量的类。 通常情况下,我们创建的变量...

网友评论

    本文标题:关于ThreadLocal

    本文链接:https://www.haomeiwen.com/subject/pynlpktx.html