面试难题,不用ThreadLocal 程序会崩吗?

ThreadLocal面试高频 ThreadLocal是Java中的线程局部变量工具,通过为每个线程提供独立变量副本来实现线程隔离和数据传递。其核心原理是利用线程内部的ThreadLocalMap存储数据,以ThreadLocal实例为key。使用时需注意内存泄漏问题:由于Entry中value是强引用,需在finally块中调用remove()清理。相比synchronized,它通过空间换时间避免锁竞争。父子线程共享数据可用InheritableThreadLocal,但线程池场景需使用TransmittableThreadLocal 阅读详情

这个问题我疑问了很久很久,主要如下截图。

个连接对应一个事务,多个连接的事务是不一样的,先大概了解一下,往下看????

本人是在学threadlocal的时候,网上大部分人都是说数据库连接池是典型的用了threadloca的例子,然后我就又查数据库连接池和threadloca的关系,但是,99%都说threadlocal是为了在并发的情况下,为了保证线程安全,创建了副本什么的,其实这只是threadlocal的用法之一,它还有个用法就是确保同一线程之间参数传递的方便(扯远了)

回归正题,还是拿上面的图来说事。。。。

我只讲两个关键点,明白人一看就懂:

1、两者有根本性的区别,用处不一样!

连接池是缓存并托管数据库连接,主要是为了提高性能。

而ThreadLocal缓存连接,是为了把同一个数据库连接“分享”给同一个线程的不同调用方法。(不管调用哪个方法,都是使用的同一个连接,方便进行“跨方法”的事务控制)

举个栗子:

如果一个请求中涉及多个 DAO 操作,而如果这些DAO中的Connection都是独立的话,就没有办法完成一个事务。但是如果DAO 中的 Connection 是从 ThreadLocal 中获得的(意味着都是同一个对象), 那么这些 DAO 就会被纳入到同一个 Connection 之下。

2、重点要理解“连接池”。

连接池里面有一定数量的连接资源,比如最大20个连接。

题外话:如果直接通过 Java原生API 获取“直连”的话:

底层方法一般都是这样写的:

java.sql.DriverManager.getConnection(url, props);

java.sql.Driver.connect(url, props);

特点是:要传入url、用户名和密码等信息)

这种方式,肯定就没有使用数据库连接池。

使用数据库连接池,通常都是得到一个所谓的javax.sql.DataSource[接口]的实例对象,它里面包含了Connection,并且数据库连接池工具类(比如C3P0、JNDI、DBCP等),肯定是重新定义了getConnection、closeConnection等方法,所以你每次得到的Connection,几乎都不是新建立的连接(而是已经建立好并放到缓存里面的连接),你调用closeConnection方法,也不是真正的关闭连接(一般都是起到一个标识作用,标识当前连接已经使用完毕,归还给连接池,让这个连接处于待分配状态)

PS:所以说:使用数据库连接池时,还是要显式的调用数据库连接池API提供的关闭连接的方法。

理解一下这句话:

不同的线程在同一个时间( 或者 同一个线程在多个地方)从连接池中拿到的Connection,肯定不是同一个连接。(反过来讲:不同时间的两个线程,一前一后,则有可能拿到同一个连接)

总结:

再好好理解一下上面的一段话,我再最后解释亿下。。。

1、首先,我们为了避免单一数据库连接的创建和关闭耗费时间和性能,引入了数据库连接池,提前创建好了n条连接放入池中,如果是单线程情况下,那这样挺好的

2、那如果是多线程情况下呢?还是上面那段话,假设同一时间多个线程从数据库连接池获取连接,那肯定拿的是不同的连接,我当前线程和别的线程拿的连接不一样,那我当前在crud的时候,不在一个事务之内。

3、假设不同时间的多个线程要从数据库连接池拿连接,那这个时候就可能拿到的是同一个连接了,那我多个线程线程拿到的是同一个连接,也就是说在多个线程在同一个事务之内,线程a执行了插入还没来得及提交,线程b此时来了个更新,在线程a还未操作完之前,线程b更新完了后,直接把连接给close了,线程a插了一半发现插不了了。。。此时肯定在想,这™是谁在搞我。为了确保不同时间多个线程可能拿到的是同一个连接,那么此时threadlocal闪亮登场,就算我拿的是“同一个连接”,在引入了threadlocal后,每个线程之间都会创建独立的连接副本,将collection各自copy一份,这样就互相不干扰了。

来源:http://mtw.so/5uzL9h

MT9V034摄像头学习笔记(一)_mt9v034摄像头循迹代码(1) 函数名称:uint8_t SCB_RegRead(uint8_t Device,uint8_t Address,uint16_t *Data)* 函数名称:uint8_t SCB_RegWrite(uint8 Device,uint8 Address,uint16 Data)* 函数名称:uint8 SCCB_SendByte(uint8 Data)* 函数名称:uint8 SCCB_ReadByte(void)* 修改时间:2018年3月4日。* 修改时间:2018年3月4日。 阅读详情

相关推荐

解放双手!利用海康VM全局脚本+通讯管理打造自动化视觉控制系统

本文深入探讨了如何利用海康VisionMaster(VM)的全局脚本和通讯管理功能,打造高效自动化视觉控制系统。通过全局变量实现数据共享与动态调整,结合多协议通讯管理,提升系统响应速度与智能化水平,适用于工业4.0环境下的复杂视觉检测与决策场景。

weixin_28720573的博客 425

面试难题,不用ThreadLocal 程序会崩吗?,java面试结果多长时间出来

本人是在学threadlocal的时候,网上大部分人都是说数据库连接池是典型的用了threadloca的例子,然后我就又查数据库连接池和threadloca的关系,但是,99%都说threadlocal是为了在并发的情况下,为了保证线程安全,创建了副本什么的,其实这只是threadlocal的用法之一,它还有个用法就是确保同一线程之间参数传递的方便(扯远了)当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了。回归正题,还是拿上面的图来说事。

2401_84023314的博客 564

别再死记硬背了!用LabVIEW串口通信的3个真实项目案例,手把手教你从调试到部署

本文通过3个真实项目案例,详细讲解LabVIEW串口通信从调试到部署的全过程。涵盖Arduino温湿度监控、西门子PLC Modbus通信以及高可靠性通信框架设计,提供实用技巧和常见问题解决方案,帮助工程师快速掌握LabVIEW串口通信的实战应用。

weixin_30485379的博客 525

数据库连接池为什么要用threadlocal呢?不用会怎样?

来源:blog.youkuaiyun.com/qq_42405666/article/details/108258820这个问题我疑问了很久很久,主要如下截图。个连接对应一个事务,多个连接的事务是不一...

Java笔记虾 602

奥比中光Gemini335L SDK实战:从标定参数到3D点云转换

本文详细介绍了奥比中光Gemini 335L深度相机的SDK实战应用,重点讲解如何跳过繁琐的棋盘格标定,直接调用出厂预标定参数实现高效的3D点云转换。通过解析内参、外参获取及四种核心坐标转换模式,并结合OpenCV等工具,指导开发者快速将相机集成到机器人抓取、三维测量等项目中,实现开箱即用的3D视觉解决方案。

raspberrypi5的博客 643

从CTF到实战:Frida Hook无导出SO函数的3种特殊姿势

本文深入探讨了在移动安全逆向工程中,如何利用Frida Hook无导出SO函数的三种高级技巧:字符串引用定位法、调用栈回溯法和内存特征码扫描。针对安卓So层加固和混淆场景,文章结合CTF赛题与实战案例,详细解析了每种方法的原理、实现步骤与适用场景,为安全研究人员提供了从理论到实践的完整解决方案。

jenkins8butler的博客 518

听说阿里百度这样的大公司,面试经常拿ThreadLocal考验求职者?(万字总结)

为什么要学习ThreadLocal呢?因为面试官经常问,而且在线程中使用它可以给我们提供一个线程内的本地局部变量,这样就可以减少在一个线程中因为多函数之间的操作导致共享变量传值的复杂性,说白了,我们使用ThreadLocal可以做到在一个线程内随时随地的取用,而且与其他的线程互不干扰。 在一些特殊的情景中,应用ThreadLocal会带来极大的便利,不过很多人却搞不懂Threadlocal到底是个...

庆哥Java的优快云技术博客 1万+

基于 STM32 的乒乓球发球机控制系统设计与实现

乒乓球发球机是一种能够按照预设参数自动、连续发出乒乓球的训练设备。本系统以 STM32F103C8T6 为主控核心,通过控制实现球速调节、实现落点与旋转方向控制、实现出球节奏控制,并配合 OLED 显示与按键人机交互,实现速度、频率、落点、旋转四大参数的可调发球训练。

weixin_42300449的博客 212

JDBC、ThreadLocal、连接池等底层封装

​ 这种写法每次获取到的是一个新连接--我希望只获取到同一个连接。

Excellent999的博客 377

如何使用rdma-core来实现RDMA操作

rdma-core 是一个开源项目,为远程直接内存访问(RDMA)提供用户空间的支持。它包括 RDMA 设备的驱动程序、库和工具,旨在简化 RDMA 应用的开发和部署。

嵌入式技术开发 3902

三菱MC协议(MC/TCP):避坑指南|C#实现三菱MC协议:软元件(X/Y/M/D)读写与帧格式解析

核心避坑逻辑:MC协议的坑80%集中在“PLC配置”“地址编码”“字节序”,先解决这三点,通信就成功了一半;实战优先级:新手优先用开源库(Mitsubishi.MCProtocol),避免手动拼接帧格式的复杂坑;进阶再研究帧格式解析;排坑技巧:先Ping通→用调试助手验证→写C#代码,分层排查,不要混在一起找问题。掌握这些避坑技巧后,你可以轻松实现C#与三菱全系列PLC的稳定通信,满足工业场景中数据采集、设备控制等核心需求。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2201

ThreadLocal在数据库连接中的应用

之前一直觉得ThreadLocal没用,后来看到别人在数据库连接中的相关讲解后发现这个类真的很实用。 在数据库连接中为了提高服务器的响应速度,通常都会采用数据库连接池的方式来获取数据库连接。 C3P0Utils实现 public class C3P0Utils { private static DataSource source;//数据源 static{ source = new

u010386139的博客 5778

提升YOLOv8检测精度的边界框损失函数Focaler-IoU与InnerFocalerIoU的应用与效果

YOLOv8是一种常用的实时目标检测模型,基于CNN(卷积神经网络)结构并结合了一些改进技术以提高检测精度和速度。YOLOv8的核心在于边界框的预测和分类,而准确的边界框预测是提高模型整体性能的关键因素之一。在传统的IoU损失基础上,Focaler-IoU和InnerFocalerIoU进一步聚焦于边界框的边缘区域,通过调整损失权重,更好地关注难以检测的边界框,提高模型的鲁棒性和准确性。# 计算IoU# 计算Focaler-IoU损失在这里,我们定义了。

博客 1344

美团面试,问了ThreadLocal原理,这个回答让我通过了

他想都想不到,ThreadLocal我烂熟于心

1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java(面试必备):面试中的 ThreadLocal 原理和使用场景

面试中的 ThreadLocal 原理和使用场景 前言 今天博主将为大家分享Java(面试必备):面试中的 ThreadLocal 原理和使用场景,不喜勿喷,如有异议欢迎讨论! 相信大家在面试中经常被问过 ThreadLocal 的原理和用法,虽然一直知道这个东西的存在但是一直没有好好的研究一下原理,没有自己的知识体系。今天安利一波有待提高 ThreadLocal 是什么 ThreadLoca...

Mr_chen的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

threadLocal 面试题总结

文章目录 目录 系列文章目录 文章目录 前言 一、ThreadLocal是什么? 二、Thread,ThreadLocal,ThreadLocalMap这三者是什么关系 1.类之间的关系 2.既然这个Entry的key为一个弱引用的threadLocal,那会有什么问题 3.那么作者是怎么解决这个问题的呢 总结 前言 3月份在面试中总结的java基础多线程ThreadLocal面试题,在这里总结一下 提示:以下是本篇文章正文内容,下面案例可供参考 ...

qq_36098514的博客 3955

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

为什么数据库连接池要用 ThreadLocal 呢?不用会怎么样?

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。

2401_83621541的博客 978

【面试精讲】ThreadLocal是什么,ThreadLocal源码分析,ThreadLocal应用,ThreadLocal内存泄漏

ThreadLocal是什么,ThreadLocal源码分析,ThreadLocal应用,ThreadLocal内存泄漏

小明的Java问道之路 5万+

面试之ThreadLocal

在面试环节中,考察"ThreadLocal"的理解十分必要。常用的提问方式如下: “知道ThreadLocal吗?” “讲讲你对ThreadLocal的理解” 当然了,也有面试官会慢慢引导到这个话题上,比如提问“在多线程环境下,如何防止自己的变量被其它线程篡改”等等。 这篇文章主要从以下几个角度来分析理解 1、ThreadLocal是什么 2、ThreadLocal源码分析 3、ThreadLocal内存泄漏问题及解决方案 一、ThreadLocal是什么 ThreadLocal即本地线程变量,它填充的变量

jike11231的博客 3260

ThreadLocal详解(附面试题)

文章目录ThreadLocal详解(附面试题)1.ThreadLocal介绍2.基本使用2.1 常用方法2.2 栗子2.3 ThreadLocal类与synchronized关键字3.ThreadLocal 的内部结构3.1 JDK8之前的设计3.2 JDK8的优化4.ThreadLocal 的核心方法源码4.1 set方法4.2 get方法4.3 remove方法4.4 initialValue方法5.ThreadLocalMap 源码分析5.1 基本结构5.2 弱引用和内存泄漏5.3 hash冲突的解决

小皮皮LL的博客 3470

被面试官问懵了,ThreadLocal的key为什么设置成弱引用?

目录前言面试连环炮key为什么要设置成弱引用?value为什么不设置成弱引用 前言 想起来去年九月夜郎自大,面过一次蚂蚁金服,一面面试官上来一串ThreadLocal的连环炮直接把我干懵了……虽然现在回想起来问得都挺简单,不过还是来做一发总结,希望看到这篇文章的小伙伴以后就不要栽坑里了。 面试连环炮 先来体验一下关于ThreadLocal的连环炮: ThreadLocal是什么?项目中用到过吗? ThreadLocal的结构是怎么样的? 使用ThreadLocal需要注意哪些问题? 为

womeiyouzaihuashui的博客 1万+

ThreadLocal原理解析及面试

ThreadLocal类里关于ThreadLocalMap的定义(每个Thread里都有一个ThreadLocalMap),可以说ThreadLocal关键是ThreadLocalMap,它自己只是定义了对外的接口,其他的逻辑都在ThreadLocalMap里(map的key是ThreadLocal的引用,value是我们在当前线程中设置的值),ThreadLocalMap里重点需要关注Entry,它继承了WeakReference,其实我们设置的值就是设置到这个弱引用的对象的value里,而弱引用。

个人专长:数据结构和算法、大数据、数据库、主流框架 2283

ThreadLocal 面试题整理

ThreadLocal是Java提供的线程本地变量机制,它为每个线程创建变量的独立副本,实现线程隔离。核心原理是每个Thread维护一个ThreadLocalMap,使用弱引用防止内存泄漏。与synchronized相比,ThreadLocal采用空间换时间策略,无锁性能更高。主要应用场景包括数据库连接管理、Session存储等。使用时需注意内存泄漏问题,建议声明为static final并配合remove()使用。Netty的FastThreadLocal对其进行了优化,用数组代替哈希表提升性能。Thre

weixin_39956506的博客 846

面试再问ThreadLocal,别说你不会!

点击上方“后端技术精选”,选择“置顶公众号”技术文章第一时间送达!作者:坚持就是胜利juejin.im/post/5d427f306fb9a06b122f1b94Thre...

Java笔记虾 2991

一个ThreadLocal和面试官大战30个回合

开场杭州某商务楼里,正发生着一起求职者和面试官的battle。面试官:你先自我介绍一下。安琪拉:面试官你好,我是草丛三婊,最强中单(妲己不服),草地摩托车车手,第21套广播体操推广者,火的...

磊哥聊Java 551

ThreadLocal 理解及面试

ThreadLocal的个人理解及面试问题附答案

am_Sun的博客 1757
上一篇: 面试官:如何用Redis实现分布式锁?
下一篇: 你只会用 ! = null 判空?嘿嘿!
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值