JUC并发编程面试题(自用)
线程池
1 线程池的作用:提高线程的利用率,线程复用,频繁的创建和销毁线程非常浪费资源
线程池的七大参数:
-
corePoolSize(核心线程数):线程池中始终保持的活动线程数,即使它们处于空闲状态也不会被回收。
-
maximumPoolSize(最大线程数):线程池中允许存在的最大线程数。当工作队列满了且核心线程已经都在工作时,线程池会创建新的线程,但不会超过这个值。
-
keepAliveTime(线程空闲时间):当线程池中的线程数量超过核心线程数时,多余的空闲线程在空闲时间达到一定值后会被终止。
-
unit(线程空闲时间的单位):用于指定keepAliveTime的时间单位,例如秒、毫秒等。
-
workQueue(工作队列):用于存放等待执行的任务的队列,可以是有界队列或无界队列,如
LinkedBlockingQueue、ArrayBlockingQueue等。 -
threadFactory(线程工厂):用于创建线程的工厂,通常用来自定义线程的名称、优先级等。
-
handler(拒绝策略):当工作队列已满且线程池中的线程数量达到最大线程数时,新任务的处理策略,有四种常见的策略(下文有详细介绍)。
四种常见的拒绝策略:
-
ThreadPoolExecutor.AbortPolicy(默认策略):当工作队列已满且线程池中的线程数量达到最大线程数时,抛出
RejectedExecutionException异常,拒绝新任务的提交。 -
ThreadPoolExecutor.CallerRunsPolicy:当工作队列已满时,该策略会将任务返回给调用者(即当前线程),这样任务提交者将自己执行任务,不会被丢弃。
-
ThreadPoolExecutor.DiscardOldestPolicy:当工作队列已满时,该策略将丢弃队列中最旧的任务(即队列头部的任务),然后尝试重新提交当前任务。
-
ThreadPoolExecutor.DiscardPolicy:当工作队列已满时,该策略会默默地丢弃新的任务,不会抛出异常也不会执行任务
过程:任务加入线程池后,先判断核心线程数是否达到最大,如果达到,加入任务队列,如果任务队列已满,开启非核心线程,如果达到最大线程数,开始执行拒绝策略。
关闭线程池:shutdown与shutdownnow的区别,前者决绝任务的提交,把之前任务队列中未完成的任务完成之后再关闭 ,后者直接关闭所有正在运行的任务。
如何设置最大线程数:cpu密集型,设置为cpu的核数,Io密集型,两倍cpu核数
为什么要自定义线程池参数?
我们发现newFixedThreadPool和newSingleThreadExecutor方法他们都使用了LinkedBlockingQueue的任务队列,LikedBlockingQueue的默认大小为Integer.MAX_VALUE。而newCachedThreadPool中定义的线程池大小为Integer.MAX_VALUE。
所以阿里禁止使用Executors创建线程池的原因就是FixedThreadPool和SingleThreadPool的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
CachedThreadPool允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。
synchronized
原理:
synchronized 是 Java 中用于实现同步的关键字,它的原理涉及到 Java 对象头和对象监视器的概念。以下是 synchronized 的基本原理:
-
Java 对象头:每个 Java 对象在内存中都有一个对象头,其中包含了对象的元数据信息,如哈希码、GC 分代信息等。这些元数据存储在对象头中,占用一定的内存空间。
-
对象监视器(Monitor):Java 对象头中的一部分用于实现同步,被称为对象监视器或锁。每个对象都有一个关联的对象监视器,它用于控制对对象的并发访问。对象监视器可以被锁定(locked)和解锁(unlocked)。
Synchronized的语义底层是通过一个monitor(监视器锁)的对象来完成,
每个对象有一个监视器锁(monitor)。每个Synchronized修饰过的代码当它的monitor被占用时就
会处于锁定状态并且尝试获取monitor的所有权 ,过程:
1.如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为
monitor的所有者。
2.如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1.
3.如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再
重新尝试获取monitor的所有权。
特性
可重入性:一个拿到锁的线程可以多次进入同步方法中,比如在同步方法中调用另一个该锁对象的同步方法,底层使用计数器实现1.如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为
monitor的所有者。
2.如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1.
3.如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再
重新尝试获取monitor的所有权。
不可中断性:线程进入同步方法后,其他线程只能阻塞等待,不能中断拿到锁的进入同步方法里面的线程
synchronized 中四种锁的升级
在 Java 中,synchronized 关键字支持多种不同的锁升级策略。这些策略使锁能够在多线程环境下有效地保护共享资源,同时最大程度地减少线程间的竞争和锁的开销。
0 无状态锁:没有任何线程进入同步代码块
-
偏向锁(Biased Locking):偏向锁是为了优化单线程场景而引入的。在单线程环境中,无需进行复杂的竞争,所以第一个获得锁的线程会获得偏向锁,之后再次进入同步块时,无需竞争,直接获得锁。只有在有其他线程争用锁的情况下,偏向锁才会升级为轻量级锁。
-
轻量级锁(Lightweight Locking):轻量级锁是为多线程场景优化的锁升级策略。当多个线程尝试争夺锁时,JVM会将偏向锁升级为轻量级锁。轻量级锁使用 CAS 操作(比较并交换)来尝试获取锁,而不是阻塞线程。如果获取锁的尝试成功,那么线程可以快速进入临界区。如果失败(轻量级锁会在达到一定的cas次数阈值之后升级为重量级锁),它会升级为重量级锁。
-
重量级锁(Heavyweight Locking):重量级锁是最传统的锁升级策略,当多个线程争夺锁时,会导致其他线程阻塞,直到获得锁的线程释放锁。这种锁升级策略涉及到操作系统层面的线程阻塞和唤醒,因此性能开销相对较高。
synchronized 与Lock锁的区别
1 synchronized 是一个关键字,Lock是一个接口
2 synchronized 是非公平锁,Lock可以实现公平锁
3 synchronized 会自动释放锁,Lock必须手动加锁与释放锁
4 在线程之间通信时synchronized 无法精准唤醒
5 lock锁更灵活的锁住代码
什么是自旋
很多 synchronized 里面的代码只是一些很简单的代码,执行时间非常快,此时等待的线程都加锁
可能是一种不太值得的操作,因为线程阻塞涉及到用户态和内核态切换的问题。既然
synchronized 里面的代码执行得非常快,不妨让等待锁的线程不要被阻塞,而是在 synchronized
的边界做忙循环,这就是自旋。如果做了多次循环发现还没有获得锁,再阻塞,这样可能是一种更
好的策略。
CAS
cas是unsafe包下的一个方法。基于乐观锁的实现机制。原理是:内存值 预期值 新值,如果内存值与预期值相等,就把新值赋值给内存值,否则失败。cas用于轻量级锁。
i++的同步操作:1 获取i的内存值 2 A=i+1 3 i=A
cas是实现第三步
cas导致的问题:
1、ABA 问题:
比如说一个线程 one 从内存位置 V 中取出 A,这时候另一个线程 two 也从内存中取出 A,并且 two 进行了一些操作变成了 B,然后 two 又将 V 位置的数据变成 A,这时候线程 one 进行 CAS 操作发现内存中仍然是 A,然后 one 操作成功。尽管线程 one 的 CAS 操作成功,但可能存在潜藏的问题。从Java1.5 开始 JDK 的 atomic包里提供了一个类 AtomicStampedReference 来解决 ABA 问题。问题:取钱,多按了几次取50的操作,总共100,第一次成功变为50,如果有人转账给你50,现在卡里有100,第二次取钱操作也会执行成功,变为50,造成数据不一致问题
2、循环时间长开销大:
对于资源竞争严重(线程冲突严重)的情况,CAS 自旋的概率会比较大,从而浪费更多的 CPU 资源,效率低于 synchronized。
3、只能保证一个共享变量的原子操作:
当对一个共享变量执行操作时,我们可以使用循环 CAS 的方式来保证原子操作,但是对多个共享变量操作时,循环 CAS 就无法保证操作的原子性,这个时候就可以用锁。
Volatile:
可见性、有序性
ThreadLocal
ThreadLocal的使用_threadlocal如何使用-CSDN博客
相关文章:
JUC并发编程面试题(自用)
线程池 1 线程池的作用:提高线程的利用率,线程复用,频繁的创建和销毁线程非常浪费资源 线程池的七大参数: corePoolSize(核心线程数):线程池中始终保持的活动线程数,即使它们处于空…...
Redis分布式会话
当探讨Redis分布式会话管理时,以下是更加详细的知识点: 1. 会话管理的挑战: 在分布式应用程序中,每个用户请求可能由不同的服务器处理。这导致了会话数据的分散性,需要一种方法来维护一致性的用户会话状态。 2. Redi…...
程序员大厂之鹅厂探秘
...
【Java 进阶篇】深入理解 JavaScript DOM Node 对象
在前端开发中,与HTML文档进行交互是一项基本任务。文档对象模型(Document Object Model,简称DOM)为开发者提供了一种以编程方式访问和操作HTML文档的方式。DOM的核心是节点(Node)对象,它代表了文…...
测试用例基础
测试用例的基本要素 测试环境, 操作步骤, 测试数据, 预期结果 测试用例的设计方法 基于需求的设计方法 需求文档 -> 梳理需求(掌握需求) -> 针对文档设计测试用例 只是针对需求进行大概的测试 具体的设计方法 等价类 等价类: 依据需求将输入(特殊情况…...
“Flex弹性布局、轮播图mock遍历数据和首页布局解析与实践“
目录 引言1. Flex弹性布局介绍及使用什么是Flex弹性布局?Flex容器与Flex项目Flex属性详解 2. 轮播图mock遍历数据简述轮播图的作用和意义处理mock数据的重要性使用Mock模拟数据遍历 3. 首页布局总结 引言 在现代网页开发中,灵活性和响应式布局是至关重要…...
自动化办公篇之python
1、如果没有安装xlwings库,先在控制台pip install xlwings,然后点击运行,创建四个空excel表 。 import xlwings as xw app xw.App(visibleTrue,add_bookFalse) for dept in ["技术部","销售部","运营部","财务部&q…...
华为云云耀云服务器L实例评测|使用sysbench对云耀云服务器mysql的性能测试
目录 引言 1 在centos上安装mysql 1.1 在云服务器上安装 Docker 1.2 在 Docker 中运行 MySQL 容器 2 安装sysbench并进行性能测试 2.1 安装和配置 sysbench 2.2 运行 sysbench 性能测试 3 分析测试结果 3.1 运行结果 3.2 对运行结果进行翻译 3.3 性能分析 4 清理…...
【译】快速开始 Compose 跨平台项目
原文: Compose Multiplatform application 作者:JetBrains 注意 Compose Multiplatform 中的 iOS 部分目前处于 Alpha 状态。以后可能会有不兼容的更改,届时也许需要手动进行迁移。 你可以使用这个模板来开发同时支持桌面、安卓和 iOS 的跨平…...
高性能服务器之mysql数据库连接池设计与实现
高性能服务器之mysql数据库连接池设计与实现 链接:https://pan.baidu.com/s/1ISZ1Sy087GUeaekW3sV_oA?pwd0t9q 内存泄漏 链接:https://pan.baidu.com/s/1AWPnbuzVSpoP-CnEgJk5hg?pwdaieq 提取码:aieq 线程池 链接:https://pan…...
黑客技术(自学)——网络安全
前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学?如何学? 今天给大家分享一下,很多人上来就说想学习黑客,…...
day06-前后端项目上传到gitee、后端多方式登录接口、发送短信功能、发送短信封装、短信验证码接口、短信登录接口
1 前后端项目上传到gitee 2 后端多方式登录接口 2.1 序列化类 2.2 视图类 2.3 路由 3 发送短信功能 4 发送短信封装 4.0 目录结构 4.1 settings.py 4.2 sms.py 5 短信验证码接口 6 短信登录接口 6.1 视图类 6.2 序列化类 1 前后端项目上传到gitee # 我们看到好多开源项目…...
【SA8295P 源码分析 (一)】83 - SA8295P HQNX + Android 完整源代码下载方法介绍
【SA8295P 源码分析 一】83 - SA8295P HQNX + Android 完整源代码下载方法介绍 一、高通官网 Chipcode 下载步骤介绍1.1 高通Chipcode 下载步骤1.2 高通 ReleaseNote 下载方法二、高通 HQX 代码介绍2.1 完整的 HQX 代码结构:sa8295p-hqx-4-2-4-0_hlos_dev_qnx.tar.gz2.2 sa829…...
文献阅读快速法-ChatPDF
如题,直接提供给大家一款能够快速阅读文档的好工具——iTextMaster。 iTextMaster是一款免费的pdf阅读浏览器,上传pdf文档后等待几秒钟,AI就会自动反馈给用户关于文档的摘要总结。十分的方便且实用。 ChatPDF为您提供简洁的文档摘要。对于那…...
Jenkins 内存占用
查看内存占用 # ps aux | grep 9090 root 130854 0.0 0.0 8900 708 pts/1 S 16:23 0:00 grep --colorauto 9090 root 4010748 0.2 30.7 5826500 2502884 ? Ssl Oct13 8:55 /usr/bin/java -Djava.awt.headlesstrue -jar /usr/share/java/jenkins…...
1. vue-sy-admin: 基于vue3+TypeScript的全局过滤器(filters) 封装及示例
在vue3中使用全局filters已经不是必须,有很多种替代方案(直接定义函数即可)。如果项目中使用了unplugin-auto-import插件完全可以将filters导出函数使其在全局自动引入/声明。当然在这里就不说插件的使用了。下面就详细说说如何实现 题外话: 强烈推荐使用 vueuse&a…...
操作系统监控:守护您的计算机系统稳定运行的坚实防线
在数字化时代,计算机系统已成为各行业的关键支撑。为了保证系统的稳定运行,操作系统监控成为了不可或缺的技术手段。监控易运维管理软件,作为一款全面的监控解决方案,能够监控各类Windows、Linux、UNIX等操作系统,包括…...
PostgreSQL | CTE | 使用with子句的通用表达式
CTE(Common Table Expressions) 简单讲,CTE就是日常SQL中出现的with语句,其原理就是通过提前将数据查询出来后作为临时结果集使用,可以与SELECT \ INSERT \ UPDATE \ DELETE的SQL连用。 优点 可读性强 CTE 允许你将…...
A Close Look into the Calibration of Pre-trained Language Models
本文是LLM系列文章,针对《A Close Look into the Calibration of Pre-trained Language Models》的翻译。 预训练语言模型的校准研究 摘要1 引言2 背景3 评测指标4 PLM是否学会了校准?5 现有方法的效果如何?6 结论局限性与未来工作 摘要 预…...
【控制台】报错:Uncaught ReferenceError: process is not defined
文章目录 报错示例: 解决方法参考文献:https://github.com/vfile/vfile/issues/38...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
