面试:ThreadLocal

ops/2024/10/18 18:23:22/

目录

1、ThreadLocal可以实现〔资源对象】的线程隔离,让每个线程各用各的【资源对象】,避免争用引发的线程安全问题

2、ThreadLocal同时实现了线程内的资源共享

3、原理

4、为什么ThreadLocalMap 中的 key (即 ThreadLocal )要设计为弱引用?


1、ThreadLocal可以实现〔资源对象】的线程隔离,让每个线程各用各的【资源对象】,避免争用引发的线程安全问题

每个线程获取资源时都会询问当前线程是否有连接对象

所以每个线程都会创建一个专用的连接对象接着存入自己的线程,于是形成了线程间的资源隔离隔离

2、ThreadLocal同时实现了线程内的资源共享

同上所述,因为每个线程有一个自己专属的连接对象,所以在线程内,任务都调用的同一个连接对象,于是实现了线程内的资源共享

3、原理

ThreadLocalMap:每个线程内有一个ThreadLocalMap类型的成员变量,用来存储资源对象。

  • 调用set方法,就是以ThreadLocal自己作为key,资源对象作为value,放入当前线程的 ThreadLocalMap集合中
  • 调用get方法,就是以ThreadLocal自己作为 key,到当前线程中查找关联的资源值
  • 调用remove方法,就是以ThreadLocal自己作为 key,移除当前线程关联的资源值

ThreadLocal的扩容机制是在容量达到三分之二时对存值的HashMap进行倍增;

当遇到冲突时是进行开放寻址法,从顺序的第一个未存的地址依次往后存;

4、为什么ThreadLocalMap 中的 key (即 ThreadLocal )要设计为弱引用?

ThreadLocal的KEY是弱引用的,当java虚拟机内存不够时会将它们所占用的内存释放掉;

但GC(内存不足)仅是让key的内存释放,后续还要根据key是否为null 来进一步释放值的内存,释放时机有:

  • 获取key发现null key
  • set key时,会使用启发式扫描,清除临近的null key,启发次数与元素个数,是否发现 null key有关(把临近的null key释放掉)
  • remove时(推荐),因为一般使用ThreadLocal时都把它作为静态变量,因此GC无法回收


http://www.ppmy.cn/ops/26909.html

相关文章

【热闻速递】Google 裁撤 Python研发团队

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 【🔥热闻速递】Google 裁撤 Python研发团队引入研究结论 【&#x1f5…

【PC游戏】【World of Warcraft 魔兽世界(法语版)】怀旧版 CD-ROM 安装及使用记录(一)

一、前言 正值最近暴雪和网易重修旧好之时,笔者在新加坡从一个宅男朋友nerd bro那里淘到了一套法语版的World of Warcraft,共5张CD-ROM光碟。该套光碟的发行年份是2005年,于欧盟制造。推荐的操作系统是Windows 2000或者Windows XP或者Mac OS…

Python 深度学习(一)

原文:zh.annas-archive.org/md5/98cfb0b9095f1cf64732abfaa40d7b3a 译者:飞龙 协议:CC BY-NC-SA 4.0 序言 随着全球对人工智能的兴趣不断增长,深度学习引起了广泛的关注。每天,深度学习算法被广泛应用于不同行业。本书…

数据库(MySQL)基础:函数

函数:是指一段可以直接被另一段程序调用的程序或代码。 1.字符串函数 MySQL中内置了很多字符串函数,常用的几个如下: 函数功能concat(S1,S2,...Sn)字符串拼接,将S1,S2,...Sn拼接成一个字符串lower(str)将字符串str全部转为小写…

Github2024-04-25 开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4非开发语言项目2TypeScript项目2PowerShell项目1C++项目1Dart项目1JavaScript项目1GPT4All: 在边缘运行开源大型语言模型 创建周期:…

SpringMVC中常见注解和用法

一.建立连接 RequestMapping 来实现 URL 路由映射。RequestMapping是Spring Web MVC 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路由映射的,表⽰服务收到请求时,路径为 /sayHi 的请求就会调⽤ sayHi 这个⽅法的代码。 路由映射: 当…

latex+vscode一直报错,配置文件json和环境变脸配置

1、json配置文件 {"latex-workshop.latex.tools": [{"name": "xelatex","command": "xelatex","args": ["-synctex1","-interactionnonstopmode","-file-line-error","%DOCF…

条款2:最好使用C++类型转换操作符

旧版类型转换 想想低阶转型动作。它几乎像goto一样被视为程序设计上的“贱民”。 尽管如此,它却仍能够苟延残喘,因为当某种情况愈来愈糟,转型可能是必要的。是的,当某种情况愈来愈糟,转型是必要的! 不过…