多线程面试合集

前言

前文介绍了JVM相关知识,本文将重点介绍多线程相关知识以及工作中的一些经验。

多线程面试合集

  1. 什么是多线程?为什么我们需要多线程?

多线程是指在一个进程中同时执行多个线程,每个线程可以执行不同的任务。多线程可以提高程序的执行效率,充分利用多核CPU的计算能力,同时处理多个任务。

  1. 在Java中创建线程有几种方式?

继承Thread类并重写run()方法;
实现Runnable接口并重写run()方法;
实现Callable接口并重写call()方法,这种方式通常与线程池一起使用。

  1. 解释一下线程的生命周期?

线程的生命周期包括新建、就绪、运行、阻塞和死亡五个状态。新建状态表示线程已被创建但尚未启动;就绪状态表示线程已准备好运行,等待CPU调度;运行状态表示线程正在执行;阻塞状态表示线程由于某种原因暂时停止执行;死亡状态表示线程执行完毕或出现异常而结束。

  1. 什么是线程安全?Java中如何实现线程安全?

线程安全是指在多线程环境下,程序的执行结果不会因为线程的调度顺序而改变。Java中实现线程安全的方式有多种,如使用synchronized关键字、使用Lock接口及其实现类、使用volatile关键字、使用原子类、使用线程安全的集合类等。

  1. 什么是死锁?如何避免死锁?

死锁是指两个或多个线程互相等待对方释放资源而无限期地等待下去。避免死锁的方法包括:
避免一个线程同时获取多个锁;
按照固定的顺序获取锁;
使用定时锁,即尝试获取锁,若超过一定时间则放弃;
使用死锁检测工具来检测和恢复死锁。

  1. 解释一下synchronized关键字和Lock接口的区别?

synchronized关键字和Lock接口都可以用来实现线程同步,但它们在使用方式和功能上有所不同。synchronized是Java语言的关键字,它可以修饰方法或代码块,实现线程同步;而Lock接口是Java.util.concurrent包中的一个接口,它提供了更灵活的线程同步机制,如支持可重入锁、可中断获取锁、尝试获取锁等。

  1. 解释一下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提供了一种高效且灵活的实现同步器的方式,可以满足不同的并发编程需求。

  1. 什么是线程池?为什么要使用线程池?

线程池是一种管理和复用线程的技术,它可以避免频繁地创建和销毁线程,提高程序的性能。使用线程池的好处包括:
降低资源消耗:通过复用已创建的线程,减少在创建和销毁线程上花费的时间以及系统资源的开销;
提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行;
提高线程的可管理性:线程池可以进行统一的分配、调优和监控。

  1. 介绍一下Java中的几种线程池及其应用场景?

Java中的线程池主要包括FixedThreadPool、CachedThreadPool、SingleThreadExecutor和ScheduledThreadPool等。FixedThreadPool适用于处理CPU密集型任务,控制线程最大并发数;CachedThreadPool适用于处理大量短时间任务,线程数会根据任务量动态调整;SingleThreadExecutor适用于需要保证顺序地执行各个任务,并且在任意时间点,不会有多个线程是活动的场景;ScheduledThreadPool适用于需要定时执行或周期性执行任务的场景。
在真实的应用环境下我们一般都自定义ThreadPoolExecutor,并且没有通用的配置,要根据任务执行时间、CPU处理能力等因素综合考虑,具体的需要结合压测进行评估。

  1. ThreadLocal家族

ThreadLocal 是 Java 中的一个类,它提供了线程本地变量。这些变量与普通变量不同,因为每个访问变量的线程都有自己的独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,它们为使用该变量的每个线程都持有一个独立的值。
ThreadLocal 的主要作用是提供线程内的数据隔离,避免多线程环境下的数据竞争和不一致问题。每个线程都可以独立地改变自己的副本,而不会影响其他线程所持有的副本。
以下是 ThreadLocal 的一些关键点:
线程隔离:最重要的特性,确保变量对每个线程都是独立的。
避免同步:由于数据是隔离的,因此不需要使用 synchronized 关键字来同步访问。
初始值:可以通过覆盖 initialValue() 方法来为 ThreadLocal 变量设置初始值。
内存泄漏风险:如果不正确地使用 ThreadLocal(例如,长时间持有对象引用而不清理),可能会导致内存泄漏。特别是在使用线程池时,因为线程池中的线程通常不会被销毁,所以它们的 ThreadLocal 变量也不会被垃圾收集。
不适用于所有场景:ThreadLocal 适用于需要在单个线程内维护状态的情况,但不适用于需要在多个线程之间共享数据的场景。
如上文,ThreadLocal仅用于单线程场景
在父子线程场景下,我们要使用InheritableThreadLocal,原理是在new Thread的过程中将数据下传
在多线程场景下,我们要使用TransmittableThreadLocal,在主线程向子线程传递数据。具体的原理主要通过传输器在主线程捕捉数据并在子线程回放快照。

  1. 在使用线程池时有哪些经验?以及遇到过哪些问题?

使用经验:**在配置线程池参数要综合考虑CPU核数、单任务耗时等因素。**不可笼统的按照经验配置,这样可能在一般场景下不会出现什么问题,但是在大流量场景下会爆发出一系列问题:如jvm无法承载达到的流量导致阻塞、任务积压导致服务假死重启等。在配置好参数之后,最好通过压测进行目前性能的测试,并配置服务接口的限流,以防实际情况压垮服务。在业务场景中,要进行线程隔离,以防调用不均衡导致资源分配侵袭影响核心流程。
常见问题:1. 配置线程数、队列数太少,在回传调用线程拒绝策略下,如有突发流量会导致主线程阻塞,长时间持续会压垮服务。2. 线程数配置太多,导致CPU负载高,处理能力下降 3. 队列配置太大导致任务积压在队列中,无法消费,从而影响某些核心节点甚至导致内存溢出。4. 核心任务可配置拒绝策略为Call并限流,不能任其大流量进入、突发场景下最好配置拒绝策略为丢弃,以防导致调用线程阻塞 5. 最好重写拒绝策略,并配置监控告警、同时命名业务线程池。

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

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

相关文章

什么是“原子类“ 和 CAS “无锁化编程“?如何解决 CAS 编程中的 ABA 问题?

目录 一、什么是"原子类"? 二、什么是 CAS ? 三、CAS 的 ABA 问题是什么? 四、如何解决 ABA 问题? 一、什么是"原子类"? "原子类"是 Java 标准库提供的 CAS 工具类。存放于 java.ut…

Springboot响应数据详解

功能接口 Controller下每一个暴露在外的方法都是一个功能接口 功能接口的请求路径是RequestMapping定义的路径,浏览器需要请求该功能则需要发出该路径下的请求。 RestController RestControllerControllerResponseBody(响应数据的注解) ResponseBody 类型&#…

【数据分析】numpy基础第二天

文章目录 前言数组的形状变换reshape的基本介绍使用reshapereshape([10, 1])运行结果reshape自动判断形状reshape([-1, 1])运行结果 合并数组使用vstack和hstackvstack和hstack的运行结果使用concatenateconcatenate运行结果 分割数组array_split运行结果 数组的条件筛选条件筛…

Matlab|【完全复现】基于价值认同的需求侧电能共享分布式交易策略

目录 1 主要内容 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序完全复现《基于价值认同的需求侧电能共享分布式交易策略》,针对电能共享市场的交易机制进行研究,提出了基于价值认同的需求侧电能共享分布式交易策略,旨在降低电力市…

腾讯云幻兽帕鲁服务器创建教程,附4核16G服务器价格表

腾讯云0基础搭建帕鲁服务器4C16G14M服务器稳定无卡顿,先下载SteamCMD,并运行;然后下载Palserver,修改服务ini配置,启动PalServer,进入游戏服务器。腾讯云百科txybk.com分享腾讯云创建幻兽帕鲁服务器教程&am…

写点东西《JWT 与会话身份验证》

写点东西《JWT 与会话身份验证》 身份验证与授权 JWT 与session身份验证 - 基本差异 什么是 JWT? JWT 结构: JWT 工作流程:优势: 安全问题: 处理令牌过期: 基于session的身份验证(通常称为基于 cookie 的身…

深度强化学习(王树森)笔记07

深度强化学习(DRL) 本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL 源代码链接:https://github.c…

java语言深度讨论

try-with-resource写法对构造器抛异常的处理 如果我们在类的构造器里抛出异常,try-with-resource写法是没法自动调close的。逻辑上很好理解,你对象都没成功创建,我为啥要调close啊。 从反编译的代码里也可以看出端倪: MyParser p…

Qt|大小端数据转换

后面打算写Qt关于网络编程的博客,网络编程就绕不开字节流数据传输,字节流数据的传输一般是根据协议来定义对应的报文该如何组包,那这就必然牵扯到了大端字节序和小端字节序的问题了。不清楚的大小端的可以看一下相关资料:大小端模…

类和对象:为什么C++推荐使用多态

优势: 在开发中追求开放扩展,封闭修改,多态的使用使得源程序可以更方便的进行扩展而不需要修改源代码。同时多态也使代码的可读性更强。 案例1:利用多态实现计算器类 class AbstractClaculator { public:virtual int getResult…

harr小波变换及其逆运算的推导及演示

哈尔小波(Haar wavelet)是最早提出的小波变换之一,它的变换和逆变换运算比较简单。对于一维信号(向量)的哈尔小波变换,可以分为两个步骤:分解步骤和重建(逆变换)步骤。 正向变换: 对于给定的四元组 (a, b, c, d),两次哈尔小波变换的过程如下: 第一次变换: 计算两…

c++线程thread示例

本文章记录c创建线程&#xff0c;启动线程和结束线程的代码。 需要注意&#xff0c;编译时需要添加-lpthread依赖。 代码&#xff1a; ThreadTest.h #ifndef TEST_THREAD_TEST_H #define TEST_THREAD_TEST_H#include <thread> #include <mutex>class ThreadTes…

【华为 ICT HCIA eNSP 习题汇总】——题目集11

1、某公司的内网用户采用 NAT 技术的 NO-pat 方式访问互联网&#xff0c;若所有的公网地址均被使用&#xff0c;则后续上网的内网用户会&#xff08;&#xff09;。 A、挤掉前一个用户&#xff0c;强制进行 NAT 转换上网 B、将报文同步到其他 NAT 转换设备上进行 NAT 转换 C、自…

springboot集成 Redis快速入门demo

一、准备redis环境 这里用docker-compose来搭建Redis测试环境&#xff0c;采用单机模式&#xff0c;具体配置如下&#xff1a; docker-compose-redis.yml version: 3 services:redis:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/redis:6.0.8 # ima…

kafka详细解释

什么是kafka Kafka是一个开源的分布式流处理平台&#xff0c;最早由LinkedIn开发&#xff0c;并于2011年成为Apache软件基金会的顶级项目。Kafka使用高效、可扩展和持久化的方式处理流式数据&#xff0c;可以存储和处理大规模的实时数据流。Kafka的核心概念包括消息生产者、消息…

编程笔记 html5cssjs 064 JavaScrip语言规则

编程笔记 html5&css&js 064 JavaScrip语言规则 JavaScript 有哪些基本的语言规则&#xff1f; 接下来正式接触编程语言了&#xff0c;每一门语言都有一些基本的语言规则&#xff0c;这些规则有些在没有具体使用之前可能不好理解&#xff0c;初学者简单了解就可以了&…

牛客周赛30

思路&#xff1a;先把x, y除以最大公约数变成最小值&#xff0c;然后同时乘以倍数cnt&#xff0c;只记录两个数都在[l,r]间的倍数。 代码&#xff1a; int gcd(int a,int b){return b ? gcd(b, a % b) : a; }void solve(){int x, y, l, r;cin >> x >> y >>…

ubuntu中的rsyslog

目录 1. rsyslog简介 2. 查看/var/log 3. syslog的配置文件 3.1 /etc/rsyslog.d/50-default.conf 3.2 /etc/rsyslog.conf 4. 如何写入syslog 4.1 C语言 4.2 shell 4.3 内核输出 5. syslog.1和syslog.2.gz等文件是如何生成 6. logrotate是如何被执行 7. 如何限制sys…

【网络】WireShark过滤 | WireShark实现TCP三次握手和四次挥手

目录 一、开启WireShark的大门 1.1 WireShark简介 1.2 常用的Wireshark过滤方式 二、如何抓包搜索关键字 2.1 协议过滤 2.2 IP过滤 ​编辑 2.3 过滤端口 2.4 过滤MAC地址 2.5 过滤包长度 2.6 HTTP模式过滤 三、ARP协议分析 四、WireShark之ICMP协议 五、TCP三次握…

Jmeter学习系列之一:Jmeter的详细介绍

目录 一、Jmeter的介绍 二、Jemeter的特点 三、Jemter相关概念 3.1采样器&#xff08;Samplers&#xff09; 3.2逻辑控制器&#xff08;Logic Controllers&#xff09; 3.3监听器&#xff08;Listeners&#xff09; 3.4配置元件&#xff08;Configuration Elements&#…