ThreadLocal常见面试题

1.请介绍一下ThreadLocal底层是怎么实现的?

一个线程开始运行的时候,通过set方法会把值放入threadLocals这个变成中,他的类型是ThreadLocalMap对象,里面是Entry数组,每一个Entry是键值对形式,key就是ThreadLocal的引用,value就是我们set进去的值,这个数组的初始大小是16,达到阈值的时候会进行扩容(阈值=16*2/3)

2.ThreadLocal为什么会内存泄漏?

ThreadLocal是一个类似于HashMap的数据结构;

ThreadLocal的实现原理就是通过set把value set到线程的threadlocals属性中,threadlocals是一个Map,其中的key是ThreadLocal的this引用,value是我们所set的值; 

如果一个线程执行完业务正常销毁,是不会产生内存泄露的,但是如果是一个线程池里的线程,在执行完业务后没有销毁而是回到了线程池中,就会产生内存泄漏,因为线程不销毁threadLocals就会存在,而他的类型TreadLocalMap就会存在,里面的Entry数组就存在以及他的每一个Entry键值对也存在,不断累积就会造成内存泄漏,其实底ThreadLocal底层有处理,就是每次set或get的时候key是空的,他就会把所有空的key的Entry给回收掉,但是建议在finally代码块中调用ThreadLocal的remove方法,这样可以避免内存泄漏。

3.请说说sleep()和wait()有什么区别? 

wait()和sleep()方法都是Java中用于线程控制的方法,它们都让线程暂停执行,但它们之间存在一些区别:
1. 所属类和调用方式
wait()方法属于Object类,需要在synchronized块或方法中调用。
sleep()方法属于Thread类,可以在任何地方调用。
2. 对锁的处理机制
wait()方法会释放锁,让出CPU资源,并且线程进入等待状态,直到被其他线程唤醒。
sleep()方法不会释放锁,线程会一直占用CPU资源,只是暂停执行一段时间。
3. 唤醒机制
wait()方法需要被notify()或notifyAll()方法唤醒。
sleep()方法会自动苏醒,不需要其他线程唤醒。
4. 用途
wait()方法通常用于线程间通信和协作,例如生产者-消费者模型。
sleep()方法通常用于让线程暂停执行一段时间,例如模拟延迟操作。
5. 异常处理
wait()方法可能会抛出InterruptedException异常,需要捕获处理。
sleep()方法不会抛出异常。
6. 总结
①wait()方法和sleep()方法都让线程暂停执行,但wait()方法会释放锁,sleep()方法不会释放锁。
②wait()方法需要被notify()或notifyAll()方法唤醒,sleep()方法会自动苏醒。
③wait()方法通常用于线程间通信和协作,sleep()方法通常用于让线程暂停执行一段时间。
一些关于wait()和sleep()方法的常见问题

①什么时候使用wait()方法?
当需要线程间通信和协作时,例如生产者-消费者模型。
当需要线程等待某个条件发生时,例如等待某个资源可用。

②什么时候使用sleep()方法?
当需要让线程暂停执行一段时间时,例如模拟延迟操作。
当需要让线程休息一下,避免CPU资源过度消耗时。

③wait()方法和sleep()方法哪个更好?
如果需要线程间通信和协作,则应该使用wait()方法。
如果只是需要让线程暂停执行一段时间,则可以使用sleep()方法。

4.多个线程如何保证按顺序执行? 

1、通过join()方法使当前线程“阻塞”,等待指定线程执行完毕后继续执行;

2、通过创建单一化线程池newSingleThreadExecutor()实现;

3、通过倒数计时器CountDownLatch实现;

4、使用Object的wait/notify方法实现;

5、使用线程的Condition(条件变量)方法实现;

6、使用线程的CyclicBarrier(回环栅栏)方法实现;

7、使用线程的Semaphore(信号量)方法实现; 

5.Java线程池中submit()和execute()方法有什么区别? 

(1) 两个方法都可以向线程池提交任务;

(2) execute只能提交Runnable,无返回值;

(3) submit既可以提交Runnable,返回值为null,也可以提交Callable,返回值Future;

(4) execute()方法定义在Executor接口中;

(5) submit()方法定义在ExecutorService接口中;

(6) execute执行任务时遇到异常会直接抛出;

(7) submit执行任务时遇到异常不会直接抛出,只有在调用Future的get()方法获取返回值时,才会抛出异常;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/874382.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue 3 + Element Plus 封装单列控制编辑的可编辑表格组件

在Web应用开发中,经常需要提供表格数据的编辑功能。本文将介绍如何使用Vue 3结合Element Plus库来实现一个支持单列控制编辑功能的表格,并通过封装组件的形式提高代码的复用性。通过本教程,你将学会如何构建一个具备单列控制编辑功能的表格组…

NISP 一级 | 3.3 网络安全防护与实践

关注这个证书的其他相关笔记:NISP 一级 —— 考证笔记合集-CSDN博客 0x01:虚拟专用网络 VPN 概述 虚拟专用网络(Virtual Private Network,VPN)是在公用网络上建立专用网络的技术。整个 VPN 网络的任意两个节点之间的连…

基于Java+SpringBoot+Vue+MySQL的美容美发管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的美容美发管理系统【附源码文档】、前后…

HAProxy--高性能反向代理

文章目录 Web架构负载均衡介绍为什么使用负载均衡负载均衡类型 HAProxy简介应用场景HAProxy是什么HAProxy功能 脚本安装HAProxy基础配置global多进程和线程HAProxy日志配置项 Proxies配置-listen-frontend-backendserver配置 frontendbackend配置实例子配置文件 HAProxy调度算法…

OpenCV findTours函数及其用法

OpenCV的findTours函数的原型如下: 函数参数: Image 输入图像,需8位单通道图像。非零像素被视为1。零像素保持为0,因 此图 像被视为二进制。您可以使用compare、inRange、threshold、adaptiveThreshold、Canny等从灰度或彩色图像…

注册网站怎么注册

网站注册成为我们日常生活中不可或缺的一部分。无论是社交媒体、电子商务平台还是各种在线服务,注册都是参与这些平台的第一步。下面将为您详细介绍一般网站注册的步骤,帮助您轻松完成注册过程。 1. 选择合适的网站 在注册之前,首先要确定您…

MeterSphere的一次越权审计

1 MeterSphere简介 MeterSphere是一个一站式开源持续测试平台,它提供了测试跟踪、接口测试、UI测试和性能测试等功能。它全面兼容JMeter、Selenium等主流开源标准,助力开发和测试团队实现自动化测试,加速软件的高质量交付。MeterSphere 的特点…

python爬虫基础:了解html

编辑器vscode <!DOCTYPE html> <html><head><title>第一个网页</title></head><body><h1>字体</h1><h2>字体</h2><h3>字体</h3><p>Lorem, ipsum dolor sit amet consectetur adipisicing…

网络学习-eNSP配置NAT

NAT实现内网和外网互通 #给路由器接口设置IP地址模拟实验环境 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]interface gigabitethernet 0/0/0 [Huawei-Gigabi…

ETL数据集成丨MySQL到MySQL的数据迁移实践

前言 MySQL数据迁移至另一MySQL数据库的过程&#xff0c;不仅是数据复制或移动的操作那么简单&#xff0c;它还涉及到一系列策略性考量和技术优化&#xff0c;旨在实现数据的高效、安全传输&#xff0c;以及确保目标系统的高性能运行。其深远意义在于为企业的数字化转型提供强…

vscode 中使用 yarn 出错

问题 vscode 中使用 yarn 爆红&#xff0c;类似下图的错误&#xff1a; 原因 由于vscode中的集成终端使用的是powershell&#xff0c;所以需要设置下该权限才能正常使用yarn 解决 找到 powershell&#xff0c;以管理身份运行 输入&#xff1a;set-ExecutionPolicy Remot…

【目标检测数据集】铁轨表面缺损检测数据集4789张VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4789 标注数量(xml文件个数)&#xff1a;4789 标注数量(txt文件个数)&#xff1a;4789 标注…

前端---对MVC MVP MVVM的理解

就需要从前端这些年的从无到有、从有到优的变迁过程讲一下。 1. Web1.0时代 在web1.0时代并没有前端的概念&#xff0c;开发一个web应用多数采用ASP.NET/Java/PHP编写&#xff0c;项目通常用多个aspx/jsp/php文件构成&#xff0c;每个文件中同时包含了HTML、CSS、JavaScript、…

安科瑞Acrelcloud-6000银行安全用电管理平台在湖南新盛业的应用

摘要 安科瑞Acrelcloud-6000安全用电管理平台是针对我国当前电气火灾事故频发而创新的一套电气火灾预警和预防管理系统&#xff0c;该系统是基于移动互联网、云计算技术、通过物联网传感终端&#xff08;现场监控模块、传输模块&#xff09;&#xff0c;将供电侧、用电侧电气安…

jupyter出错ImportError: cannot import name ‘np_utils‘ from ‘keras.utils‘ ,怎么解决?

文章前言 此篇文章主要是记录一下我遇到的问题以及我是如何解决的&#xff0c;希望下次遇到类似问题可以很快解决。此外&#xff0c;也希望能帮助到大家。 遇到的问题 出错&#xff1a;ImportError: cannot import name np_utils from keras.utils &#xff0c;如图&#xf…

Sky Takeaway

软件开发整体介绍 软件开发流程 角色分工 软件环境 苍穹外卖 项目介绍 定位&#xff1a;专门为餐饮企业定制的一款软件产品 技术选型 前端环境搭建 阅读readme文档 nginx.exe放入无中文目录运行并启动 后端环境搭建 项目结构 Nginx反向代理 优点 配置 Nginx反向代理 负…

Open CASCADE学习|通过指定点的曲线

在OpenCASCADE中&#xff0c;如果你想通过一系列指定的点来创建一条曲线&#xff0c;你可以使用Geom2dAPI_Interpolate类来实现二维曲线的插值&#xff0c;或者使用GeomAPI_Interpolate类来实现三维曲线的插值。这些类允许你定义一条B样条曲线&#xff0c;这条曲线将精确地通过…

【Sceneform-EQR】通过sceneform-eqr实现一个视频播放器(使用安卓MediaPlayer实现视频播放)

在前一篇文档中介绍了如何在AR\三维场景创建几种背景 【Sceneform-EQR】scenefrom-eqr中的几种背景实现(不仅用于AR、三维场景&#xff0c;在图片、视频播放器中也适用) 本文将侧重介绍如何使用安卓MediaPlayer实现视频播放。 ↓↓↓↓↓↓↓↓↓↓↓↓ 以下正文 ↓↓↓↓↓↓…

艺术体操与骑行的完美协奏:维乐Angel Rise+坐垫,激情与力量的展现!

在艺术体操的赛场上&#xff0c;每一次旋转、每一次跳跃&#xff0c;都凝聚着运动员的力量与技巧。这不仅是一场速度与激情的碰撞&#xff0c;更是一次力量与技巧的交融。正如在骑行的领域里&#xff0c;VELO Angel Rise坐垫以它独特的一体成型设计和技术&#xff0c;为骑行者们…

windows通过wsl2安装linux系统之Ubuntu,傻瓜式安装

期望通过每一次分享&#xff0c;让技术的门槛变低&#xff0c;落地更容易。 —— around 目录 1.基础环境和要求2.安装wsl23.安装linux系统4.迁移linux系统挂载5.配置linux账号密码6.配置ssh登录方式待续… 前言 为什么要在windows上安装linux&#xff0c;这个问题当你是研发…