面试 Java 并发编程八股文十问十答第九期

面试 Java 并发编程八股文十问十答第九期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)ThreadLocal造成内存泄漏的原因?

ThreadLocal 造成内存泄漏的主要原因是在使用完 ThreadLocal 后没有及时清理对应的线程副本。当线程结束后,如果没有手动清理 ThreadLocal 对应的值,那么该值将会一直存在于内存中,不会被垃圾回收器回收,从而导致内存泄漏。

具体来说,当一个线程结束时,如果 ThreadLocalMap 中的 Entry 对象没有被及时清理,其中的 value 对象将无法被回收,从而造成内存泄漏。

2)ThreadLocal内存泄漏解决方案?

为了避免 ThreadLocal 的内存泄漏,可以采取以下解决方案:

  • 及时清理:在使用完 ThreadLocal 后,手动调用 remove() 方法清理对应的线程副本。可以使用 try-finally 语句块来确保在任何情况下都能进行清理操作。
  • 使用弱引用:可以使用弱引用来存储 ThreadLocal 对象,这样当线程结束时,ThreadLocal 对象将会被垃圾回收器回收,从而自动清理线程副本。可以使用 InheritableThreadLocal 类来代替 ThreadLocal,因为它使用了弱引用来存储 ThreadLocal 对象。
  • 使用线程池:在使用线程池时,应该及时清理 ThreadLocal 的值,以避免线程重用时出现副本的问题。

3)什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?

阻塞队列的实现原理是通过使用锁和条件变量来实现的。当队列为空时,从队列中获取元素的操作会进入等待状态,直到有新的元素被添加到队列中,并通知等待的线程;当队列已满时,往队列中添加元素的操作会进入等待状态,直到有空位被释放,并通知等待的线程。

阻塞队列可以用来实现生产者-消费者模型,其中生产者线程负责往队列中添加元素,消费者线程负责从队列中获取元素。生产者线程和消费者线程可以并发地操作队列,而不需要显式地进行同步操作。阻塞队列提供了一种简单而高效的方式来实现线程间的通信和协作。常见的阻塞队列实现包括 ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue 等。

4)什么是线程池?有哪几种创建方式?

线程池是一种管理和复用线程的机制,它通过预先创建一定数量的线程,并将任务提交给这些线程来执行,从而避免了频繁创建和销毁线程的开销。线程池可以根据需要动态地调整线程数量,以适应不同的工作负载。

Java 中的线程池可以通过 ThreadPoolExecutor 类来创建和管理。常见的线程池创建方式包括:

  • 使用 Executors 工具类的静态方法创建线程池,如 Executors.newFixedThreadPool()、Executors.newCachedThreadPool() 等。
  • 使用 ThreadPoolExecutor 类的构造函数自定义线程池的参数,如核心线程数、最大线程数、线程空闲时间等。

5)线程池有什么优点?

线程池具有以下优点:

  • 提高性能:线程池可以重复利用已创建的线程,避免了线程创建和销毁的开销,提高了程序的性能。
  • 提高响应性:线程池可以根据需要动态调整线程数量,确保任务能够及时得到处理,提高了系统的响应性。
  • 提供线程管理和监控:线程池提供了对线程的管理和监控功能,可以方便地控制线程的数量、状态和执行优先级,以及监控线程的运行情况。
  • 控制资源占用:线程池可以限制线程的数量,避免过多的线程占用系统资源,从而提高系统的稳定性和可靠性。

6)线程池都有哪些状态?

Java 中的线程池有以下几种状态:

  • RUNNING:线程池处于运行状态,可以接受新的任务,并处理已提交的任务。
  • SHUTDOWN:线程池处于关闭状态,不再接受新的任务,但会处理已提交的任务。
  • STOP:线程池处于停止状态,不再接受新的任务,也不会处理已提交的任务,并且会中断正在执行的任务。
  • TIDYING:线程池正在进行状态转换,例如在 SHUTDOWN 状态下,当所有任务都已完成时,会转换为 TIDYING 状态。
  • TERMINATED:线程池已经终止,不再接受新的任务,也不会处理已提交的任务。

线程池的状态转换是有顺序的,一般是从 RUNNING 状态开始,经过 SHUTDOWN、TIDYING 最终到达 TERMINATED 状态。

7)什么是 Executor 框架?为什么使用 Executor 框架?

Executor 框架是 Java 中用于管理和执行线程任务的框架。它提供了一种简单、灵活和可扩展的方式来创建和管理线程,以及处理并发任务。

使用 Executor 框架的好处包括:

  • 提供了线程池的管理和复用机制,避免了频繁创建和销毁线程的开销。
  • 可以根据需要动态调整线程数量,以适应不同的工作负载。
  • 可以提高程序的性能和响应性,确保任务能够及时得到处理。
  • 提供了线程管理和监控功能,方便控制线程的数量、状态和执行优先级,以及监控线程的运行情况。
  • 控制资源占用,避免过多的线程占用系统资源,提高系统的稳定性和可靠性。

8)在 Java 中 Executor 和 Executors 的区别?

Executor 是一个接口,定义了执行任务的方法,主要包括 execute() 方法用于提交任务。

Executors 是一个工具类,提供了一些静态方法来创建和管理线程池。它封装了 Executor 接口的实现,提供了一些常用的线程池创建方式,如 newFixedThreadPool()、newCachedThreadPool() 等。

可以说 Executors 是 Executor 的一个实现和扩展,它提供了更方便的方式来创建和管理线程池。

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

线程池中的 submit() 和 execute() 方法都用于提交任务给线程池执行,但它们有一些区别:

  • execute() 方法只能接受 Runnable 对象,而 submit() 方法既可以接受 Runnable 对象,也可以接受 Callable 对象。
  • execute() 方法没有返回值,而 submit() 方法返回一个 Future 对象,可以用于获取任务的执行结果。
  • 对于抛出异常的任务,execute() 方法会在控制台打印异常堆栈信息,而 submit() 方法会把异常包装在 Future 对象中,需要通过调用 Future 的 get() 方法来获取异常。

一般来说,如果不需要获取任务的执行结果,可以使用 execute() 方法;如果需要获取任务的执行结果或捕获任务抛出的异常,可以使用 submit() 方法。

10)什么是线程组,为什么在 Java 中不推荐使用?

线程组是 Java 中用于对线程进行分组管理的机制。线程组可以将一组线程作为一个单元进行管理,可以统一设置线程组的优先级、守护状态等属性,也可以对线程组中的线程进行批量操作。

然而,在 Java 中,线程组并不被推荐使用。主要原因如下:

  • 线程组的功能有限,无法提供足够的灵活性和扩展性,不能满足复杂的线程管理需求。
  • 线程组的使用会增加代码的复杂性,容易引入混乱和错误。
  • 线程组并不是一种好的线程管理和调度机制,更推荐使用 Executor 框架来管理和执行线程任务。

因此,尽管线程组在某些特定场景下可能有一定的用处,但在一般情况下,应该避免使用线程组,而选择更为灵活和可扩展的线程管理方式。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端总计已经 800+ Star,1.5W+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RPC通信原理(一)

RPC通信原理 RPC的概念 如果现在我有一个电商项目,用户要查询订单,自然而然是通过Service接口来调用订单的实现类。 我们把用户模块和订单模块都放在一起,打包成一个war包,然后再tomcat上运行,tomcat占有一个进程&am…

Learn OpenGL 13 模板测试

模板测试 当片段着色器处理完一个片段之后,模板测试(Stencil Test)会开始执行,和深度测试一样,它也可能会丢弃片段。接下来,被保留的片段会进入深度测试,它可能会丢弃更多的片段。模板测试是根据又一个缓冲来进行的&a…

python爬虫-AES.CBS加密案例(mmz批量爬取)

下载mmz本页数据 批量下载请看主页!!! 代码: import requests from Crypto.Cipher import AES import base64cookies {PHPSESSID: 48nu182kdlsmgfo2g7hl6eufsa,Hm_lvt_6cd598ca665714ffcd8aca3aafc5e0dc: 1710568549,SECKEY_A…

MySql入门教程--MySQL数据库基础操作

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

Typora设置文本颜色

目录 总共分为三种方法 1.使用markdown语法的内联公式 2.使用HTML语法 3.借助第三方软件&#xff08;不建议&#xff0c;操作没那么顺滑&#xff09; 总共分为三种方法 1.使用markdown语法的内联公式 <1>首先需要在设置中勾选Markdown扩展语法下的内联公式&#xff…

【计算机系统结构】重叠方式

&#x1f4dd;本文介绍 本文主要内容位计算机系统结构的重叠方式 &#x1f44b;作者简介&#xff1a;一个正在积极探索的本科生 &#x1f4f1;联系方式&#xff1a;943641266(QQ) &#x1f6aa;Github地址&#xff1a;https://github.com/sankexilianhua &#x1f511;Gitee地址…

Python JSON 序列化以及反序列化 文件读写

Python JSON 序列化以及反序列化 JSON (JavaScript Object Notation) 是一种轻量级的文本数据存储格式。JSON 数据通常存储在字符串中&#xff0c;即JSON字符串&#xff0c;其实就是一字符串&#xff0c;只是带有一定的格式&#xff0c;可以被解析。本文使用的 Python 版本为3…

深入浅出落地应用分析:AI数字人「微软小冰」

hi,各位,今天要聊的是AI小冰,机缘巧合,投递了这家公司的产品,正好最近在看数字人相关的,就详细剖析下这款产品! 前言 小冰,全称为北京红棉小冰科技有限公司,前身为微软(亚洲)互联网工程院人工智能小冰团队,是微软全球最大的人工智能独立产品研发团队。作为微软全…

Redis中的缓存设计

缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c;缓存层和存储层都不会命中&#xff0c;通常处于容错的考虑&#xff0c;如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c;失去了缓存保护后端存储的意义。…

mysql5.7离线安装 windows

windows上离线安装mysql5.7 下载安装包 去官网下载对应版本的mysql官网 点击archives,接着选择自己要下载的版本&#xff0c;选择windows系统&#xff0c;并根据自己电脑的位数选择相应的版本【找到“此电脑”&#xff0c;鼠标右击&#xff0c;出来下拉框&#xff0c;选择“属性…

力扣爆刷第95天之hot100五连刷61-65

力扣爆刷第95天之hot100五连刷61-65 文章目录 力扣爆刷第95天之hot100五连刷61-65一、131. 分割回文串二、51. N 皇后三、35. 搜索插入位置四、74. 搜索二维矩阵五、34. 在排序数组中查找元素的第一个和最后一个位置 一、131. 分割回文串 题目链接&#xff1a;https://leetcod…

工业制造企业能耗是怎么一回事

1.1 环境信息感知设备 当前&#xff0c;工业制造企业能耗监控使用的传感装置包含电量传感器、测温传感器、ESR型燃气传感器、温度隔离变送器以及水位计&#xff0c;用于多源环境信息的感知、采集与处理分析[1]。而射频识别&#xff08;RadioFrequencyIDentification&#xff…

【django framework】ModelSerializer+GenericAPIView接口数据流

GenericAPIView数据从序列化到最终返回响应的数据流 // 以ModelSerializergenerics.CreateAPIView为例 程序终归是为了处理数据&#xff0c;怎么处理&#xff0c;以怎样的顺序和方法去处理&#xff0c;就涉及到了具体的业务流程。当我们是用了一个牛掰的框架&#xff0c;发现原…

考察c语言关键字

C语言——关键字 1.问题&#xff1a;简述goto语句的作用 答&#xff1a;无条件跳转 具体来说&#xff0c;其作用在于允许程序在执行时无条件地跳转到指定的标签位置&#xff0c;并从该标签位置继续执行。通过goto语句&#xff0c;可以实现程序流程的无条件转移&#xff0c;使得…

使用PWM实现呼吸灯功能

CC表示的意思位捕获比较&#xff0c;CCR表示的是捕获比较寄存器 占空比等效于PWM模拟出来的电压的多少&#xff0c;占空比越大等效出的模拟电压越趋近于高电平&#xff0c;占空比越小等效出来的模拟电压越趋近于低电平&#xff0c;分辨率表示的是占空比变化的精细程度&#xf…

离线安装docker、docker-compose、Mysql镜像

离线安装docker docker-compose mysql镜像 一、下载docker docker-compose mysql 镜像文件 1、首先下载docker镜像 博主所用文件版本号&#xff1a; docker-23.0.6.tgz 下载docker 地址 &#xff1a;https://blog.csdn.net/xiaohanshasha/article/details/135489623?spm1001…

使用动态ip上网稳定吗?

随着互联网的普及&#xff0c;越来越多的用户开始关注网络隐私和安全。代理IP服务应运而生&#xff0c;为广大用户提供了一个有效的解决方案。许多用户在使用代理IP时可能会担心其稳定性问题&#xff0c;本文将为您详细解答。 一、什么是动态IP&#xff1f; 动态IP是指由DHCP…

CNN 论文及代码汇总,持续更新中~~

转载请注明作者和出处:http://blog.csdn.net/john_bh/ ** CNN 论文及代码汇总,持续更新中~~** 文章目录 1. Metrics2. Paper List2.1 Survey2.2 Papers20241. Metrics 2. Paper List 2.1 Survey XXXXX2.2 Papers 2024 PeLK: Parameter-efficient Large Kernel ConvNets …

【Hadoop大数据技术】——MapReduce经典案例实战(倒排索引、数据去重、TopN)

&#x1f4d6; 前言&#xff1a;MapReduce是一种分布式并行编程模型&#xff0c;是Hadoop核心子项目之一。实验前需确保搭建好Hadoop 3.3.5环境、安装好Eclipse IDE &#x1f50e; 【Hadoop大数据技术】——Hadoop概述与搭建环境&#xff08;学习笔记&#xff09; 目录 &#…

网络安全,硬防迪云

要减少被攻击的频率&#xff0c;游戏开发者可以采取以下措施&#xff1a; 1. 强化安全措施&#xff1a;确保游戏服务器和用户数据的安全性&#xff0c;加密网络传输&#xff0c;防止黑客攻击和数据泄露。 2. 更新和修复漏洞&#xff1a;定期检查游戏代码和服务器&#xff0c;…