多线程高级面试题

1. 什么是 ThreadLocal?

参考答案

    ThreadLocal 叫做本地线程变量,意思是说,ThreadLocal 中填充的的是当前线程的变量,该变量对其他线程而言是封闭且隔离的,ThreadLocal 为变量在每个线程中创建了一个副本,这样每个线程都可以访问自己内部的副本变量。

2. ThreadLocal 有哪些应用场景?

参考答案

    在进行对象跨层传递的时候,使用 ThreadLocal 可以避免多次传递,打破层次间的约束。线程间数据隔离进行事务操作,用于存储线程事务信息。数据库连接,Session 会话管理。

3. ThreadLocal 是否会内存泄漏?

参考答案

    会。当仅仅只有 ThreadLocalMap 中的 Entry 的 key 指向 ThreadLocal 的时候,ThreadLocal 会进行回收的!!!ThreadLocal 被垃圾回收后,在 ThreadLocalMap 里对应的 Entry 的键值会变成 null,但是 Entry 是强引用,那么 Entry 里面存储的 Object,并没有办法进行回收,所以有内存泄漏的风险。

4. 为什么要使用线程池?

参考答案

    降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度,当任务到达时,任务可以不需要等到线程创建就立即执行。提高线程的可管理性,线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以统一分配。

5. execute() 和 submit() 区别?

参考答案

    execute()方法只能执行 Runnable 类型的任务。submit () 方法可以执行 Runnable 和 ca11ab1e 类型的任务。submit()方法可以返回持有计算结果的 Future 对象,同时还可以抛出异常,而 execute() 方法不可以。

6. shutdown() 和 shutdownNow() 区别?

参考答案

    shutdown() 会将线程池状态置为 SHUTDOWN,不再接受新的任务,同时会等待线程池中已有的任务执行完成再结束。shutdownNow() 会将线程池状态置为 SHUTDOWN,对所有线程执行 interrupt() 操作,清空队列,并将队列中的任务返回回来。

7. volatile 的作用和特性?

参考答案

    作用:volatile 是一个轻量级的 synchronized,一般作用于变量,在多处理器开发的过程中保证了内存的可见性。相比于 synchronized 关键字,volatile 关键字的执行成本更低,效率更高。特性:可见性:volatile 可以保证不同线程对共享变量进行操作时的可见性。即当一个线程修改了共享变量时,另一个线程可以读取到共享变量被修改后的值。有序性:volatile 会通过禁止指令重排序进而保证有序性。 

8. volatile 和 synchronized 区别?

参考答案

    volatile 是在告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取,synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。volatile 仅能使用在变量级别;synchronized 则可以使用在变量、方法、和类级别的volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化

9. 什么是乐观锁?什么是悲观锁?

参考答案

    悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作(例如报错或者自动重试)。悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确。乐观锁适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅提升。

10. 什么是可重入锁?什么是非可重入锁?

参考答案

    可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者 class),不会因为之前已经获取过还没释放而阻塞。非可重入锁,则与上面相反,再进入该线程的内层方法不会自动获取锁进而造成线程出现死锁,整个等待队列中的所有线程都无法被唤醒。

11. 为什么 wait,notify 和 notifyAll 这些方法不在 Thread 类里面??

参考答案

    原因是每个对象都拥有 monitor(锁),所以让当前线程等待某个对象的锁,当然应该通过这个对象来操作,而不是用当前线程来操作,因为当前线程可能会等待多个线程的锁,如果通过线程来操作,就非常复杂了。

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

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

相关文章

【airsim】两分钟,用python脚本获取虚拟数据集

现有的教程在配置基于python的airsim环境过程中,都要求执行完整的编译步骤。然而,在linux和windows上的编译过程中会遇到诸多问题,大概需要半天左右时间。 如果你只是想采集一些数据,测试一下虚拟数据的效果,那么解决…

一个企业可以申请多少公众号?

一般可以申请多少个公众号?目前公众号申请数量的规定是从2018年底开始实施的,至今没有变化。规定如下:1、个人可以申请1个个人主体的公众号;2、企业(有限公司)可以申请2个公众号;3、个体户可以申…

ts字面量类型

ts支持将一个字面量当成一个类型使用 let foo:"hello" foo hello foo a //不能将a分配给hello类型TS提供3种字面量类型 字符串字面量类型 实际上单个的字符串字面量类型并不是很有用,但是可以使用联合类型将多个字符串字面量组合成一个类型&#x…

2022年多元统计分析期中试卷

多元正态均值检验 一、去年卖出的一岁牛犊的平均身高为 51 英寸,平均背脂厚度是 0.3 英寸,平均肩高是 56 英寸。已知今年卖出的 76 头一岁牛犊的 3 项平均指标为(50, 0.2, 54)‘,样本协差阵及其逆矩阵为 S [ 3.00 − 0.053 2.97 − 0.053 0…

VS Code结合Live Server插件快速搭建小游戏并发布至公网可随时远程访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 本篇教程,我们将通过VS Code实现远程开发MENJA小游戏,并通过cpolar内网穿透发布到公网,分…

如何在 iPhone 上检索已删除的短信:6个有效方法分享

您是否错误地删除了 iPhone 上的重要短信?或者您可能删除了“消息”应用程序中的整个对话并想将其恢复?无论您的情况如何,有一些数据恢复方法可以帮助您恢复 iPhone 上已删除的邮件。 在本文中,我们将介绍在 iPhone 上恢复丢失、…

性能分析与调优: Linux 安装基于BPF的bcc-tools系统性能工具库

目录 一、实验 1.环境 2.agent服务器安装使用ELRepo安装依赖包 3.agent服务器安装基于BPF的bcc-tools系统性能工具库 二、问题 1.安装bcc-tools后执行命令报错 一、实验 1.环境 (1)主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 pro…

【ChatGPT】提示设计的艺术:使用清晰的语法

探索清晰的语法如何使您能够将意图传达给语言模型,并帮助确保输出易于解析 All images were generated by Scott and Marco. 这是与Marco Tulio Ribeiro共同撰写的关于如何使用指导来控制大型语言模型(LLM)的系列文章的第一部分。我们将从基…

promise 是什么?它有哪些作用?

promise是一种编程概念,用于处理异步操作,可以在JavaScript中使用。 Promise有以下几个作用: 异步操作的顺序控制:Promise可以按指定的顺序执行多个异步操作,确保它们按照预期的顺序执行。错误处理:Promi…

C语言-第十八周做题总结-数组3

id:454 A.字符串逆序 题目描述 输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。 输入 输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。 输出 在一行中输出逆序后的字符串。 输入样例 输出样例 题解 先用一个while…

【多线程】

文章目录 一、线程与进程的概念:二、多线程实现三、线程锁四、线程数量的设置 一、线程与进程的概念: 简单理解 假设总共有3个孩子需要喂饭,孩子每吃一口饭需要咀嚼消化一下。 多线程方案: 雇佣1个保姆,在喂A孩子吃饭…

人机之间的联系

人机之间的联系指的是人类和机器之间的交互和合作关系。人机联系的目的是通过利用机器的计算能力和人类的智能能力来实现更高效、更准确的工作和决策。 人机之间的看得见的链接,是指人与机器之间通过视觉、听觉等感官传递信息的方式,如人与电脑之间通过显…

生成式AI在自动化新时代中重塑RPA

生成式AI的兴起正在推动行业的深刻变革,其与RPA技术的结合,标志着自动化领域新时代的到来。这种创新性结合极大地提升了系统的适应性,同时也推动了高级自动化解决方案的发展,为下一代RPA的诞生奠定了坚实的基础。 核心RPA技术专注…

使用Java构建RESTfulWeb服务

构建RESTful Web服务是一种常见的Web开发方法,它提供了一种简单、可扩展和易于使用的方式来设计和实现Web API。Java作为一种强大而广泛使用的编程语言,提供了多种工具和框架来构建RESTful Web服务。在本文中,我将介绍如何使用Java构建RESTfu…

基础面试题整理2

1.抽象类与接口区别 语法: 抽象类用abstract定义;接口用interface定义抽象类被子类继承extends(不可用final修饰);接口被类实现implements抽象类的属性访问无限制,方法不可用private修饰;接口中的方法只能…

BRC20 技术分析

文章目录 什么是 BRC20 ?brc20 白皮书。重点基于链上数据解析获取交易详情返回值如何将 16 进制转换为 字符串没有节点,如何获取数据?见证隔离如何解析出 BRC20 数据?最后如何快速搭建节点BRC20 Indexer

[C#]使用sdcb.paddleocr部署v4版本ocr识别模型

【官方框架地址】 https://github.com/sdcb/PaddleSharp 【算法介绍】 PaddleOCR,全称为PaddlePaddle OCR,是PaddlePaddle深度学习平台下的一款强大的光学字符识别工具。它利用深度学习技术,实现了高精度的文字识别,可以帮助用户…

计数器的LED显示控制电路图

如图所示,图a中采用十进制七段存储-译码-驱动单元74143,此单元对所有段都有恒流输出。在电压为5V时每段电流约为15~22mA.七段译码器的BCD数据可以由脚17~20上取出。脚22用于进位,即当计数值到9后就为低电平,其余为高电平。利用这个信号可以控…

Eureka工作原理及代码实例

Eureka是Netflix开源的一个服务发现框架,它的作用是让分布式系统中的服务实例能够自动注册和发现。本篇博客将详细介绍Eureka的工作原理及其组件。 1、Eureka的基础组件 Eureka包含两个基本组件:Eureka Server和Eureka Client。Eureka Server为服务注册…

测试:Fuzz测试

简介 Fuzz测试(Fuzz Testing)是一种软件测试技术,其核心思想是向系统输入大量异常、随机生成的数据(称为“模糊数据”或“fuzz”),以此触发系统潜在的错误或漏洞,如崩溃、安全漏洞、性能问题等…