ThreadLocal分析总结:
- 1、ThreadLocal 是什么
- 它是一个数据结构,像 HashMap,可保存 "key : value" 键值对;
ThreadLocal 有一个内部类ThreadLocalMap,用于存储数据。 - 但一个 ThreadLocal 只能保存一个,并且各个线程的数据互不干扰。
- 它是一个数据结构,像 HashMap,可保存 "key : value" 键值对;
- 2、ThreadLocalMap
- 在 ThreadLoalMap 中,初始化一个大小 16 的 Entry 数组;
- Entry 对象用来保存每一个 key-value 键值对,只不过这里的 key 永远都是 ThreadLocal 对象;
- 通过 ThreadLocal 对象的 set 方法,结果把 ThreadLocal 对象自己当做 key,放进了 ThreadLoalMap 中。
- 3、hash冲突解决:
- 线性探测,步长加 1 或减 1。代码是在set和getEntry方法中(nextIndex方法)
- 4、内存泄漏?
- 产生原理?
- ThreadLocalMap中的key是ThreadLocalMap自己,是弱引用。
见代码实现,Entry extends了WeakReference,还在代码中调用super方法,将key设置为弱引用。 - ThreadLocal 在没有外部对象强引用时,发生 GC 时弱引用 Key 会被回收,而 Value 不会回收,如果创建 ThreadLocal 的线程一直持续运行,那么这个 Entry 对象中的 value 就有可能一直得不到回收,发生内存泄露。
- ThreadLocalMap中的key是ThreadLocalMap自己,是弱引用。
- 解决:
- 使用完 ThreadLocal 之后,显示调用 remove 方法。将 Entry 节点和 Map 的引用关系移除,这样整个 Entry 对象在 GC Roots 分析后就变成不可达了,下次 GC 时就可以被回收。
注:要是renove之后还要使用怎么办?
- 使用完 ThreadLocal 之后,显示调用 remove 方法。将 Entry 节点和 Map 的引用关系移除,这样整个 Entry 对象在 GC Roots 分析后就变成不可达了,下次 GC 时就可以被回收。
- 产生原理?
- 5、总说明:
- 1、Thread里定义的对象是ThreadLocal.ThreadLocalMap,不是ThreadLocal。
- 2、每个线程中调用ThreadLocal的get和set方法,实际是对当前Thread里的ThreadLocalMap进行操作
- 3、每个线程里可以新建多个ThreadLocal,每次调用时set值,用该ThreadLocal作为key。
- 每个 ThreadLocal 对象都有一个 hash 值 threadLocalHashCode,每初始化一个 ThreadLocal 对象,hash 值就增加一个固定的大小 0x61c88647。
- 底层原理和hashMap很像,根据哈希值寻找数组索引,然后取值和设置值。
- 4、ThreadLocalMap内部是用Entry 数组存储数据。
- 6、参考:
- Java 面试必问,ThreadLocal 终极篇 - 简书 https://www.jianshu.com/p/377bb840802f
- ThreadLocal - 面试必问深度解析 - 简书 https://www.jianshu.com/p/98b68c97df9b
注:说了hash冲突如何解决(线性探测,步长加 1 或减 1),包括代码说明。
ThreadLocal分析总结:的更多相关文章
- ThreadLocal分析
我们再介绍一个在多线程环境中经常使用的类ThreadLocal,它是java为解决多线程程序的并发问题提供了一种新的方向,使用这个ThreadLocal类可以帮助开发者很简单地编写出简洁的程序,并且是 ...
- JDK之ThreadLocal分析
ThreadLocal是在是Thread的一个局部变量,今天我来分析了一下这个类 先看ThreadLocal的set方法 public void set(T value) { Thread t = T ...
- Netty源码分析-- ThreadLocal分析(九)
为了更好地探讨Netty的内存模型,后面会用到,这里我还是决定跟大家一起看下ThreadLocal和FastThreadLocal的源码,有的时候我们在看源码的时候会一层层的遇到很多之前没有看过的内容 ...
- ThreadLocal ——android消息机制handler在非主线程创建not called Looper.prepare() 错误的原因
引用自:https://www.jianshu.com/p/a8fa72e708d3 引出: 使用Handler的时候,其必须要跟一个Looper绑定.在UI线程可直接初始化Handler来使用.但是 ...
- 并发基础(十) 线程局部副本ThreadLocal之正解
本文将介绍ThreadLocal的用法,并且指出大部分人对ThreadLocal 的误区. 先来看一下ThreadLocal的API: 1.构造方法摘要 ThreadLocal(): 创建一个线程 ...
- Java 多线程--ThreadLocal Timer ExecutorService
ThreadLocal /** * ThreadLocal:每个线程自身的存储本地.局部区域 * @author xzlf * */ public class ThreadLocalTest01 { ...
- 面经手册 · 第12篇《面试官,ThreadLocal 你要这么问,我就挂了!》
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 说到底,你真的会造火箭吗? 常说面试造火箭,入职拧螺丝.但你真的有造火箭的本事吗,大 ...
- 支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos <支持JDK19虚拟线程的web框架>系列 ...
- ThreadLocal 工作原理、部分源码分析
1.大概去哪里看 ThreadLocal 其根本实现方法,是在Thread里面,有一个ThreadLocal.ThreadLocalMap属性 ThreadLocal.ThreadLocalMap t ...
随机推荐
- 怎么使用Firefox的RestClient
- Docker背景介绍
背景介绍 Docker是PasS提供商DoctCloud开源的一个基于LXC的高级容器引擎,源代码托管在Github上,基于go语言并遵从Apache2.0协议开源.Docker近期非常火热,无论是从 ...
- CentOS搭建Nginx+Subversion环境(包括多个版本库的配置)
Apache Subversion(简称SVN,svn) 因为某种原因我们需要用Nginx作为Subversion的http前端,但目前没有现成的Nginx+Subversion搭配方式. 而Subv ...
- Windows Phone 性能优化(一)
在实际的项目开发过程中,应用的性能优化是一个永恒的话题,也是开发者群里最常讨论的话题之一,我在之 前的公司做 wp项目时,也遇到过性能的瓶颈.当页面中加载的内容越来越多时,内存涨幅非常明显(特别是 一 ...
- Mysql变量声明与使用
set @today='2017-04-25';set @ydate=DATE_SUB(@today, INTERVAL 7 day);select @today, @ydate; 待续....
- dp之完全背包poj2063
题意:求投资k年获得最大投资,每年都选最大利息的方案进行投资k年后就可以得到最多的人民币. 注意:每一年收到的利息都可以作为下一年的本金......其实从测试数据来看,是很好看出来的...... 思路 ...
- python学习笔记(8)--爬虫下载占位图片
说明: 1. 虽然很简单,但总忘,所以还是记下来吧! 2. http://placekitten.com/300/300这个画猫的网站老是打开没有图片,改成了http://placehold.it/3 ...
- jquery autocomplete s.toLowerCase(); 对象不支持此属性或方法
今天发现了一个问题,自动提示删掉后再输入,会出现 s.toLowerCase(); 对象不支持此属性或方法的错误,后来格式化了jquery的autocomplete发现他是在matchSubset方法 ...
- 大数据(13) - Spark的安装部署与简单使用
一 .Spark概述 官网:http://spark.apache.org 1. 什么是spark Spark是一种快速.通用.可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校 ...
- nginx 的 autoindex on首页不显示的问题 按照下面几行要写上不然不行
[root@test html]# vim ../conf/nginx.confworker_processes 1;events { worker_connections 1024;}ht ...