多线程面试合集
前言
前文介绍了JVM相关知识,本文将重点介绍多线程相关知识以及工作中的一些经验。
多线程面试合集
- 什么是多线程?为什么我们需要多线程?
多线程是指在一个进程中同时执行多个线程,每个线程可以执行不同的任务。多线程可以提高程序的执行效率,充分利用多核CPU的计算能力,同时处理多个任务。
- 在Java中创建线程有几种方式?
继承Thread类并重写run()方法;
实现Runnable接口并重写run()方法;
实现Callable接口并重写call()方法,这种方式通常与线程池一起使用。
- 解释一下线程的生命周期?
线程的生命周期包括新建、就绪、运行、阻塞和死亡五个状态。新建状态表示线程已被创建但尚未启动;就绪状态表示线程已准备好运行,等待CPU调度;运行状态表示线程正在执行;阻塞状态表示线程由于某种原因暂时停止执行;死亡状态表示线程执行完毕或出现异常而结束。
- 什么是线程安全?Java中如何实现线程安全?
线程安全是指在多线程环境下,程序的执行结果不会因为线程的调度顺序而改变。Java中实现线程安全的方式有多种,如使用synchronized关键字、使用Lock接口及其实现类、使用volatile关键字、使用原子类、使用线程安全的集合类等。
- 什么是死锁?如何避免死锁?
死锁是指两个或多个线程互相等待对方释放资源而无限期地等待下去。避免死锁的方法包括:
避免一个线程同时获取多个锁;
按照固定的顺序获取锁;
使用定时锁,即尝试获取锁,若超过一定时间则放弃;
使用死锁检测工具来检测和恢复死锁。
- 解释一下synchronized关键字和Lock接口的区别?
synchronized关键字和Lock接口都可以用来实现线程同步,但它们在使用方式和功能上有所不同。synchronized是Java语言的关键字,它可以修饰方法或代码块,实现线程同步;而Lock接口是Java.util.concurrent包中的一个接口,它提供了更灵活的线程同步机制,如支持可重入锁、可中断获取锁、尝试获取锁等。
- 解释一下AQS?
AQS,即AbstractQueuedSynchronizer,是Java中的一个抽象队列同步器类。它是Java并发编程中的一个重要组成部分,广泛用于实现ReentrantLock、Semaphore、CountDownLatch等同步工具类。
AQS的核心思想是利用一个先进先出(FIFO)的双向队列来管理线程的竞争和等待。AQS提供了两种模式:独占模式和共享模式。独占模式是指只有一个线程可以持有同步状态,如ReentrantLock;共享模式是指多个线程可以同时持有同步状态,如Semaphore。
AQS的具体实现方式是通过维护一个volatile变量state表示同步状态。当state为0时表示没有线程占用同步状态,当state为1时表示有一个线程占用同步状态。当多个线程竞争同步状态时,只有一个线程可以成功占用同步状态,其余线程将加入到AQS的同步队列中等待。当占用同步状态的线程释放同步状态时,AQS会从同步队列中选择一个线程唤醒,使其重新尝试获取同步状态。
AQS提供了一些核心方法,如acquire(int arg)尝试获取同步状态,如果获取失败则加入同步队列并阻塞等待唤醒,直到获取同步状态成功。tryAcquire(int arg)尝试获取同步状态,如果获取成功则返回true,否则返回false。release(int arg)释放同步状态,通知其他线程可以尝试获取同步状态。
总的来说,AQS提供了一种高效且灵活的实现同步器的方式,可以满足不同的并发编程需求。
- 什么是线程池?为什么要使用线程池?
线程池是一种管理和复用线程的技术,它可以避免频繁地创建和销毁线程,提高程序的性能。使用线程池的好处包括:
降低资源消耗:通过复用已创建的线程,减少在创建和销毁线程上花费的时间以及系统资源的开销;
提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行;
提高线程的可管理性:线程池可以进行统一的分配、调优和监控。
- 介绍一下Java中的几种线程池及其应用场景?
Java中的线程池主要包括FixedThreadPool、CachedThreadPool、SingleThreadExecutor和ScheduledThreadPool等。FixedThreadPool适用于处理CPU密集型任务,控制线程最大并发数;CachedThreadPool适用于处理大量短时间任务,线程数会根据任务量动态调整;SingleThreadExecutor适用于需要保证顺序地执行各个任务,并且在任意时间点,不会有多个线程是活动的场景;ScheduledThreadPool适用于需要定时执行或周期性执行任务的场景。
在真实的应用环境下我们一般都自定义ThreadPoolExecutor,并且没有通用的配置,要根据任务执行时间、CPU处理能力等因素综合考虑,具体的需要结合压测进行评估。
- ThreadLocal家族
ThreadLocal 是 Java 中的一个类,它提供了线程本地变量。这些变量与普通变量不同,因为每个访问变量的线程都有自己的独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,它们为使用该变量的每个线程都持有一个独立的值。
ThreadLocal 的主要作用是提供线程内的数据隔离,避免多线程环境下的数据竞争和不一致问题。每个线程都可以独立地改变自己的副本,而不会影响其他线程所持有的副本。
以下是 ThreadLocal 的一些关键点:
线程隔离:最重要的特性,确保变量对每个线程都是独立的。
避免同步:由于数据是隔离的,因此不需要使用 synchronized 关键字来同步访问。
初始值:可以通过覆盖 initialValue() 方法来为 ThreadLocal 变量设置初始值。
内存泄漏风险:如果不正确地使用 ThreadLocal(例如,长时间持有对象引用而不清理),可能会导致内存泄漏。特别是在使用线程池时,因为线程池中的线程通常不会被销毁,所以它们的 ThreadLocal 变量也不会被垃圾收集。
不适用于所有场景:ThreadLocal 适用于需要在单个线程内维护状态的情况,但不适用于需要在多个线程之间共享数据的场景。
如上文,ThreadLocal仅用于单线程场景
在父子线程场景下,我们要使用InheritableThreadLocal,原理是在new Thread的过程中将数据下传
在多线程场景下,我们要使用TransmittableThreadLocal,在主线程向子线程传递数据。具体的原理主要通过传输器在主线程捕捉数据并在子线程回放快照。
- 在使用线程池时有哪些经验?以及遇到过哪些问题?
使用经验:**在配置线程池参数要综合考虑CPU核数、单任务耗时等因素。**不可笼统的按照经验配置,这样可能在一般场景下不会出现什么问题,但是在大流量场景下会爆发出一系列问题:如jvm无法承载达到的流量导致阻塞、任务积压导致服务假死重启等。在配置好参数之后,最好通过压测进行目前性能的测试,并配置服务接口的限流,以防实际情况压垮服务。在业务场景中,要进行线程隔离,以防调用不均衡导致资源分配侵袭影响核心流程。
常见问题:1. 配置线程数、队列数太少,在回传调用线程拒绝策略下,如有突发流量会导致主线程阻塞,长时间持续会压垮服务。2. 线程数配置太多,导致CPU负载高,处理能力下降 3. 队列配置太大导致任务积压在队列中,无法消费,从而影响某些核心节点甚至导致内存溢出。4. 核心任务可配置拒绝策略为Call并限流,不能任其大流量进入、突发场景下最好配置拒绝策略为丢弃,以防导致调用线程阻塞 5. 最好重写拒绝策略,并配置监控告警、同时命名业务线程池。
相关文章:
多线程面试合集
前言 前文介绍了JVM相关知识,本文将重点介绍多线程相关知识以及工作中的一些经验。 多线程面试合集 什么是多线程?为什么我们需要多线程? 多线程是指在一个进程中同时执行多个线程,每个线程可以执行不同的任务。多线程可以提高…...
从微服务到云原生
很多文章介绍云原生概念,说它包含微服务,又包含了其它几个方面的东西,还扯到文化层面、组织层面和技术层面,搞技术的人一听到公司文化问题和组织部门问题,就十分地晕眩,不能让我好好地坐下来写写代码、搞搞…...

bxCAN 主要特性
bxCAN 主要特性 ● 支持 2.0 A 及 2.0 B Active 版本 CAN 协议 ● 比特率高达 1 Mb/s ● 支持时间触发通信方案 发送 ● 三个发送邮箱 ● 可配置的发送优先级 ● SOF 发送时间戳 接收 ● 两个具有三级深度的接收 FIFO ● 可调整的筛选器组: — CAN1 和…...

武忠祥2025高等数学,基础阶段的百度网盘+视频及PDF
考研数学武忠祥基础主要学习以下几个方面的内容: 1.微积分:主要包括极限、连续、导数、积分等概念,以及它们的基本性质和运算方法。 2.线性代数:主要包括向量、向量空间、线性方程组、矩阵、行列式、特征值和特征向量等概念,以及它们的基本…...

用JavaFX写了一个简易的管理系统
文章目录 前言正文一、最终效果1.1 主页面1.2 动物管理页面-初始化1.3 动物管理页面-修改&新增1.4 动物管理页面-删除&批量删除 二、核心代码展示2.1 启动类2.2 数据库配置-db.setting2.3 日志文本域组件2.4 自定义表格视图组件2.5 自定义分页组件2.6 动物管理页面2.7 …...
第二百九十回
文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容,本章回中将介绍如何通过相机获取视频文件.闲话休提,让我们一起Talk Flutter吧。 1. …...

bert实现完形填空简单案例
使用 bert 来实现一个完形填空的案例,使用预训练模型 bert-base-chinese ,这个模型下载到跟代码同目录下即可,下载可参考:bert预训练模型下载-CSDN博客 通过这个案例来了解一下怎么使用预训练模型来完成下游任务,算是对…...

Jmeter 分布式测试
Jmeter单机进行压测,受到单台机器的性能影响,Jmeter支持分布式测试,用一个控制节点去控制多个工作节点去模拟更多的用户。 版本信息 内容版本号JDK1.8Jmeter5.6.2 分布式测试原理 jmeter 官网对分布式测试有说明,jmeter分布式…...
在 Ubuntu 上安装 Docker Engine
系列文章目录 前言 要在 Ubuntu 上开始使用 Docker Engine,请确保满足先决条件,然后按照安装步骤进行操作。 一、先决条件 注意事项 如果您使用 ufw 或 firewalld 管理防火墙设置,请注意当您使用 Docker 暴露容器端口时,这些端口…...

Mac安装nvm,安装多个不同版本node,指定node版本
一.安装nvm brew install nvm二。配置文件 touch ~/.zshrc echo export NVM_DIR~/.nvm >> ~/.zshrc echo source $(brew --prefix nvm)/nvm.sh >> ~/.zshrc三.查看安装版本 nvm -vnvm常用命令如下:nvm ls :列出所有已安装的 node 版本nvm…...

【开源】基于JAVA+Vue+SpringBoot的智慧家政系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询家政服务4.2 新增单条服务订单4.3 新增留言反馈4.4 小程序登录4.5 小程序数据展示 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的智慧家政系统࿰…...
Python NLP深度学习进阶:自然语言处理
自然语言处理(Natural Language Processing,NLP)是人工智能领域中的一个重要分支,涉及到处理和理解人类语言的方法和技术。随着深度学习的快速发展,NLP的研究和应用也在不断进步。 在Python中,有许多强大的…...

STM32单片机基本原理与应用(三)
矩阵键盘工作原理 矩阵键盘由多个独立按键组成,按键的一端接地,一端接MCU的GPIO。当按键没有被按下时,电路其实是一个断路,将单片机该引脚设置成输入上拉状态,读到的电平为高电平。当按下按键时,引脚会被拉…...
Android studio布局详解
文章目录 一、Android studio布局详解二、Android studio六大布局案例三、优缺点四、热门文章 一、Android studio布局详解 Android Studio是一种用于开发Android应用程序的集成开发环境(IDE),用于设计和编辑Android应用程序的用户界面布局。在Android …...

第四篇:怎么写express的路由(接口+请求)
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📘 引言: Ǵ…...

算法学习记录:有关树的基础
前言: 算法学习记录不是算法介绍,本文记录的是从零开始的学习过程(见到的例题,代码的理解……),所有内容按学习顺序更新,而且不保证正确,如有错误,请帮助指出。 学习工具…...
2. 《大数据之路:阿里巴巴大数据实践》学习笔记,持续更新ing
笔记链接(飞书):https://t0s016els2a.feishu.cn/docx/JrNydGljUonH1ExcGCpcoC8unTb 密码:r661391 该书籍部分目录如下: 文章目录 第1篇 数据技术篇第2章 日志采集2.1 浏览器的页面日志采集2.1.1 页面浏览日志采集流程2.1.2 页面交互日志采集…...
编程笔记 html5cssjs 062 JavaScrip如何使用
编程笔记 html5&css&js 062 JavaScrip如何使用 一、 引入JavaScript二、DOM操作三、事件处理四、数据验证五、异步编程六、使用库和框架七、模块化开发小结 开始学习使用JavaScript进行前端开发的基本步骤和常见实践。 这里先列示基本的步骤和内容,后面慢慢…...
【前端基础--7】
DOM操作 DOM,全称(Document Object Model),文档对象模型。 提供操作HTML的方法(操作页面元素) 获取节点 --- 操作元素标签 <body><div id"box">我是盒子标签</div><p class"text"&g…...

微信小程序如何搜索iBeacon设备
1.首先在utils文件夹下创建bluetooth.js和ibeacon.js 2.在 bluetooth.js文件中写入 module.exports {initBluetooth: function () {// 初始化蓝牙模块wx.openBluetoothAdapter({success: function (res) {console.log(蓝牙模块初始化成功);},fail: function (res) {console.l…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...

如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...