ThreadLocal解析

synchronized和ThreadLocal的区别:

synchronized:以时间换空间,只提供一份变量,让不同的线程排队访问,失去了并发性,降低了程序效率,着重对各线程之间访问资源的同步性

ThreadLocal:以空间换时间,每个线程都提供一份变量副本,每个线程的数据是隔离的,提高了并发性

ThreadLocal使用场景:数据库连接、Session管理

ThreadLocal的数据结构:

Mapnew ThreadLocal(),T>> map=new HashMap<>();

方便理解,源码中并没有这个map

set()方法:

getMap():

createMap():

Ok现在我们走一遍程序流程:1.现在有一个ThreadLocal实例对象->ThreadLocalconn_tl = new ThreadLocal()

调用conn_tl.set()方法,获取当前执行的线程,根据当前线程获取一个ThreadLocalMap实例对象threadLocals,threadLocals里面存 conn_tl和value

ThreadLocalMap是一个定义在ThreadLocal中的静态内部类:

static class ThreadLocalMap {

static class Entry extends WeakReference> {

Object value;

Entry(ThreadLocal> k, Object v) {

super(k);//由于Entry继承了WeakReference,所以这里以一个弱引用指向ThreadLcoal对象

value = v;

}

}

为什么ThreadLocalMap会是ThreadLocal的静态内部类:ThreadLocalMap是由ThreadLocal创建管理的,只被ThreadLocal所使用

静态内部类的作用:1)首先,用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。所以没有必要专门用一个Java文件存 放这个类。

2)静态都是用来修饰类的内部成员的。比如静态方法,静态成员变量,静态常量。它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得。

这样静态内部类就可以理解了,因为这个类没有必要单独存放一个文件,它一般来说只被所在外部类使用。并且它可以直接被用外部类名+内部类名获得。

为什么Entry中的key是弱引用:

这里的key是ThreadLocalconn_tl = new ThreadLocal()中的conn_tl。在外部他是一个强引用,在Entry中key是弱引用。也就是有两个引用指向ThreadLocal实例对象

当外部方法执行完毕,栈帧销毁强引用tl也就也就销毁了,但此时线程的ThreadLocalMap里某个entry的 k 引用还指向这个对象。若这个k 引用是强引用,就会导致k指向的ThreadLocal对象及v指向的对象不能被gc回收,造成内存泄漏,但是弱引用就不会有这个问题(弱引用及强引用等这里不说了)。使用弱引用,就可以使ThreadLocal对象在方法执行完毕后顺利被回收,而且在entry的k引用为null后,再调用get,set或remove方法时,就会尝试删除key为null的entry,可以释放value对象所占用的内存。

概括说就是:在方法中新建一个ThreadLocal对象,就有一个强引用指向它,在调用set()后,线程的ThreadLocalMap对象里的Entry对象又有一个引用 k 指向它。如果后面这个引用 k 是强引用就会使方法执行完,栈帧中的强引用销毁了,对象还不能回收,造成严重的内存泄露。

弱引用的好处:当一个对象仅仅被weak reference指向, 而没有任何其他strong reference指向的时候, 如果GC运行, 那么这个对象就会被回收。如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象。

threadlocal存连接对象的目的_终于懂了ThreadLocal,不再害怕面试官问了相关推荐

  1. threadlocal存连接对象的目的_面试官:知道ThreadLocal嘛?谈谈你对它的理解?

    在java的多线程模块中,ThreadLocal是经常被提问到的一个知识点,提问的方式有很多种,可能是循序渐进也可能是就像我的题目那样,因此只有理解透彻了,不管怎么问,都能游刃有余. 这篇文章主要从以 ...

  2. threadlocal存连接对象的目的_ThreadLocal 介绍

    概述 ThreadLocal 是 java 提供的一个方便对象在本线程内不同方法中传递和获取的类.用它定义的变量,仅在本线程中可见和维护,不受其他线程的影响,与其他线程相互隔离. 虽然在本线程不同方法 ...

  3. 后处理程序文件大小的变量_【每日一题】(17题)面试官问:JS中事件流,事件处理程序,事件对象的理解?...

    关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 2020,实「鼠」不易 2021,「牛」转乾坤 风劲潮涌当扬帆,任重道远须奋蹄! 一.前言 2020.12.23 立 ...

  4. java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

  5. 面试官问面向对象特点_最好的面试官有什么共同点?

    面试官问面向对象特点 by Aline Lerner 通过艾琳·勒纳(Aline Lerner) 最好的面试官有什么共同点? 我们查看了成千上万的真实访谈以找出答案. (What do the bes ...

  6. vue取div当前宽度_【前端大神面考面试官系列】入门Vue全家桶

    (给达达前端加星标,提升前端技能) 面试官问:Vue如何安装的呢? 达达回答:Vue的安装可以从两个方面进行安装,第一种是CDN引入,第二种是NPM安装. CDN引入 <script src=& ...

  7. 简述ip地址的abc类如何划分_面试官问:讲讲IP地址的分配原理

    网络模型介绍 在计算机网络中有著名的OSI七层协议体系结构,概念清楚,理论完整,但是它既复杂又不实用.TCP/IP体系结构则不同,得到了广泛的应用.最终结合OSI和TCP/IP的优点,采用了一种只有五 ...

  8. redis怎么修改_面试官问我Redis事务,还问我有哪些实现方式

    ❝ 「第12期」 距离大叔的80期小目标还有68期,今天大叔要跟大家分享的内容是 -- Reids中的事务.同样,这也是redis中重要指数为四颗星的必备基础知识点.下面一起来了解一下吧. ❞ 相信大 ...

  9. 面试官问你为什么选择做客服_在线客户服务-您的选择

    面试官问你为什么选择做客服 On the Web, news travels fast - and a good customer testimonial is worth its weight in ...

最新文章

  1. 宜春学院计算机专业好就业吗,宜春学院毕业生良好就业前景的背后
  2. linux导出文件夹到u盘,Linux系统放到U盘上直接在U盘上运行Linux
  3. 13 种 JavaScript 代码技巧
  4. javascript 实现禁止右键,复制,选取文本 (兼容firefox,IE,chrome等主流浏览器)...
  5. Oracle 日期加减运算
  6. 洛谷 P1080 国王游戏
  7. 微软首席技术官:不清楚平板是否昙花一现
  8. JsonHelper Json转xml,Json转DataSet,DataSet转Json
  9. AVC与H264 区别
  10. java 多环境 虚拟环境_Spring profile通过多种方法实现多环境支持
  11. 任天堂Wii有一些伟大的Wii游戏为Wii控制台你有此致
  12. Centos7安装Mysql、九条命令搞定
  13. Add couter , msn qq online status
  14. 硬货来了!轻松掌握 MongDB 流式聚合操作
  15. 单元节点和积分点有什么区别
  16. hive 计算个人的累计金额占比
  17. spring事物 设计模式_是什么使事物变得美丽,以及如何在设计中使用它
  18. 【Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)
  19. idea设置代码提示
  20. 国外主流广告联盟大推荐

热门文章

  1. mimakatz用法_两步完成利用procdump64+mimikatz获取win用户密码
  2. 老板思维:有支出必须有对应的收入
  3. Mysql 使用正则表达式
  4. Mybatis源码之(TypeAliasRegistry)TypeAlias别名实现机制
  5. ajax一次输出1万条数据库,后端接口一次给出100万条数据,请问你前端怎么分页处理...
  6. java 内存分布_一图看懂JVM内存分布,永久记住!
  7. 移除元素所有事件监听_DOM 事件模型或 DOM 事件机制
  8. linux中系统修复
  9. 把百度网站设为首页_网站百度推广效果好不好?怎样才能把网站推广到百度首页?...
  10. java随机生成1到33数组,JAVA 生成随机数数组