面试笔记-多线程篇

为什么不直接调用run方法而是调用start方法?

start方法会先创建一条线程,再用创建出的新线程去执行对应的run方法,这样才是起到多线程效果,如果直接调用run方法,则只是在原线程执行。

线程的sleep方法和wait方法的区别?

首先这两个方法都是让当前线程暂停执行一段时间,sleep方法属于Thread类的静态方法,让当前线程暂停执行,但不释放对象锁,到指定时间自动唤醒,通常用于简单的暂停操作,不涉及对象状态变更;wait方法是Object类的方法,必须在同步代码块或同步方法中调用,暂停时会释放当前线程持有的锁,需要调用notify或者notifyAll方法唤醒,通常用于线程间的通信,等待某个条件的发生。

什么是乐观锁和悲观锁?

悲观锁: 悲观锁在操作数据时比较悲观,认为别人会同时修改数据,因此操作数据时会把数据锁住,直到操作完才会释放锁;
乐观锁: 乐观锁在操作数据时非常乐观,认为别人不会同时修改数据,乐观锁不会上锁,只是在执行更新操作的时候判断一下数据有没有被修改,被修改则放弃操作,否则执行操作。

什么是CAS?

CompareAndSwap,比较与交换,主要是通过处理器的指令来保证操作的原子性,cas指令包含3个参数,共享变量内存地址的值v、预期值A以及要修改的新值B,当内存地址值与预期值相等时,才把内存地址值更新为新值B,否则不做任何操作。

说说你对原子性、可见性、有序性的理解?

原子性:是指一个操作是不可分割、不可中断的,要么全部执行并且不被打断,要么就都不执行,synchronized可以保证原子性;
可见性:是指一个线程修改了某一共享变量的值时,其他线程能够立即知道这个修改,volatile、final、synchronized可以保证可见性;
有序性:是指对于一个线程的执行代码,从前往后依次执行,单线程下可以认为程序是有序的,并发情况可能会发生指令重排序,volatile、synchronized可以保证有序性。

synchronized加锁维度?

修饰实例方法: 相当于当前对象实例加锁
修饰静态方法: 给当前类加锁
修饰代码块: this对象实例加锁 xxx.class给类加锁

对死锁的了解及避免方案?

死锁是指两个或两个以上的线程在执行过程中,因竞争资源而造成互相等待、互相阻塞的现象,在无外力作用的情况下,这些线程将一直阻塞下去
死锁的产生必须具备四个条件:
互斥使用: 资源只能同时只由一个线程占用,如果此时还有其他线程请求获取该资源,需要等待占有资源线程释放该资源;
请求与保持: 资源请求者在请求其他资源的同时,不会释放已占有资源;
不可抢占: 资源请求者不能强行从其他线程抢占资源,只能由资源持有者主动释放资源;
循环等待: 两个或两个以上线程在占用自己资源同时,相互抢占对方资源从而相互等待对方释放资源。
避免死锁方法:
破坏请求与保持: 一次性获取全部的资源;
破坏不可抢占: 线程请求资源时,如果申请失败,主动释放自己占有资源;
破坏循环等待: 按顺序申请资源,避免环路申请资源。

线程有哪些状态?

‌NEW(新建状态): Thread线程对象已经创建,但尚未调用start方法创建线程;
RUNNABLE(可运行状态): 调用start方法进入已就绪状态,该状态的线程随时可以调度运行或者已经在CPU上运行;
BLOCKED(阻塞状态): 由锁竞争引起的阻塞状态,给多个线程加上同一个锁,当有一个线程拿到锁后,剩下的线程就进入阻塞状态;
WAITING(不限时等待状态): 线程无限期的等待某个条件发生,比如调用另一线程不带参数的join方法等待对方执行完成或者调用wait方法等待;
TIMED_WAITING(限时等待状态): 有时间限制的阻塞等待,比如使用带参数的join或wait方法;
TERMINATED(终止状态): 线程执行完毕或者因异常退出run方法后,线程结束生命周期。

线程池有哪些状态?

RUNNING: 线程处于运行状态,可以接收新任务,也会处理等待队列中的任务;
SHUTDOWN: 表示线程池不再接收新任务,但会继续执行已经提交的任务(包括队列中的任务),RUNNING状态调用shutdown方法进入SHUTDOWN状态;
STOP: 表示线程池不再接收新任务,并且会尝试中断正在执行的任务,同时清空任务队列,RUNNING状态调用shutdownNow方法进入STOP状态;
TIDYING: 表示线程池的所有任务都已终止,工作线程数量为0,线程池即将进入TERMINATED状态,当SHUTDOWN状态任务队列为空,且所有任务执行完毕或者STOP状态任务队列为空,所有任务都
已终止时会进入TIDYING状态;
TERMINATED: 表示线程池已经彻底关闭,所有任务都已完成,所有工作线程都已销毁,TIDYING状态时调用terminated方法执行完毕进入TERMINATED状态。

线程池的工作流程?

刚创建时,线程池里是没有线程的,当调用execute方法添加一个任务时,会判断
a,如果正在运行的线程数量小于corePoolsize(核心线程数),就会创建线程并执行这个任务;
b.如果正在运行的线程数量大于或等于corePoolsize(核心线程数),就会把这个任务放入队列;
c.如果这个时候队列满了,而且正在运行的线程数量小于maximumPoolSize(最大线程数),就会创建非核心线程并执行这个任务;
d.如果这个时候队列满了,而且正在运行的线程数量大于或等于maximumPoolSize(最大线程数),就会根据配置的拒绝策略来处理任务;
当一个线程执行完任务,就会从队列里取下一个任务来执行,当一个线程无事可做,超keepAliveTime(空闲线程存活时间),线程池会判断当前运行的线程数量是否大于corePoolsize(核心线程数),如果大于则停掉线程,最终恢复到corePoolsize(核心线程)。

线程池有哪些拒绝策略?

AbortPolicy: 默认策略,直接抛出异常
CallerRunsPolicy: 用调用者所在的线程来执行任务
DiscardoldestPolicy: 丢弃队列里时间最早的任务,也就是即将执行的任务
DiscardPolicy: 当前任务直接丢弃,不做任何处理

线程池怎么接收异常?

try catch捕获异常
submit执行,future.get()接收异常
重写ThreadPoolExecutor.afterExecute方法处理接收的异常

更多内容正在更新中…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

25/2/6 <机器人基础> 运动学中各连杆的变换矩阵求法

变换矩阵 机器人通常包含多个关节和连杆,每个关节和连杆都有自己的局部坐标系。变换矩阵能够将一个点或向量从一个坐标系转换到另一个坐标系,从而实现对机器人各个部件位置和姿态的统一描述 变换矩阵能够将复杂的运动分解为旋转和平移的组合。通过矩阵乘…

CS 与 BS 架构的差异

在数字化的今天,选择软件架构模式对系统的性能、维护、安全和成本都有很大影响。BS架构和CS架构是最常见的两种模式,了解它们的区别和特点对开发人员和企业决策者都很重要。 CS架构最早出现,当时用户直接从主机获取数据。随着客户端和服务端…

Vuex 解析:从 Vue 2 到 Vue 3 的演变与最佳实践

Vuex 是 Vue.js 中的状态管理模式,广泛应用于 Vue 2 和 Vue 3 中,其内部实现存在一些差异。 1. 什么是 Vuex ? Vuex 是 Vue.js 官方提供的状态管理库,用于集中管理应用的所有组件的状态。主要是通过一种集中化的方式来管理共享状…

ip属地是手机号还是手机位置?一文理清

在数字化和网络化的今天,IP属地这一概念逐渐成为了人们关注的焦点。特别是在社交媒体和在线平台上,IP属地的显示往往让人联想到用户的地理位置。然而,关于IP属地到底与手机号还是手机位置有关,却存在着不少误解和混淆。本文将深入…

【C语言高级特性】预处理指令(二)

目录 一、取消宏定义(#undef) 1.1. 详细介绍 1.2. 代码示例 1.3. 使用场景 1.4. 注意事项 二、#line 指令 2.1. 详细介绍 2.2. 代码示例 2.3. 使用场景 2.4. 注意事项 三、#error 和 #warning 指令 3.1. #error 3.2. #warning 3.3 注意事项…

vim-plug的自动安装与基本使用介绍

vim-plug介绍 Vim-plug 是一个轻量级的 Vim 插件管理器,它允许你轻松地管理 Vim 插件的安装、更新和卸载。相较于其他插件管理器,vim-plug 的优点是简单易用,速度较快,而且支持懒加载插件(即按需加载) 自动…

华为支付-免密支付接入免密代扣说明

免密代扣包括支付并签约以及签约代扣场景。 开发者接入免密支付前需先申请开通签约代扣产品(即申请配置免密代扣模板及协议模板ID)。 华为支付以模板维度管理每一个代扣扣费服务,主要组成要素如下: 接入免密支付需注意&#x…

AI安全最佳实践:AI云原生开发安全评估矩阵(下)

上篇小李哥带大家一起了解了什么是AI应用云原生开发安全评估矩阵,并且介绍了利用该矩阵如何确定我们云上AI应用的安全评估范围,接下来我们将继续本系列的下篇,基于该安全评估矩阵设计和实施我们系统应具备的安全控制。 优先考虑的安全控制 …

新星杯进化史:个人发起到CSDN官方支持,创作活动的新篇章

❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。2022年度博客之星🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者&#x1…

jjwt -- Token 生成解析技术指南

引言 JWT(JSON Web Token)是一种基于JSON的、用于双方之间安全传输信息的简洁的、URL安全的令牌标准。在现代Web应用程序中,JWT作为一种高效且安全的认证机制,被广泛应用于用户身份验证和信息交换场景。本文旨在详细介绍JWT Toke…

第 2 天:创建你的第一个 UE5 C++ 项目!

🎯 目标: 掌握 UE5 C 项目的创建流程,了解代码结构,并成功运行第一个 C 类! 1️⃣ 创建 UE5 C 项目 在 UE5 中,C 项目可以与蓝图(Blueprint)结合使用,让游戏逻辑更灵活…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)

接上篇:《RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)》 链接 文章目录 4.安装RabbitMQ Messaging Topology Operator 裸金属环境部署RabbitMQ部署单实例部署集群 4.安装RabbitMQ Messaging Topology Operator 使用 cer…

vs code 使用教程

一、定义 多行注释vs 找不到上层文件路径选择 或 创建python 虚拟环境git 远程克隆及推送vs code 文件路径vs 使用tensorboard 二、使用 学习网站:https://learn.microsoft.com/zh-cn/visualstudio/python/?viewvs-2022性能分析:https://learn.micros…

【Elasticsearch】terms聚合误差问题

Elasticsearch中的聚合查询在某些情况下确实可能存在误差,尤其是在处理分布式数据和大量唯一值时。这种误差主要来源于以下几个方面: 1.分片数据的局部性 Elasticsearch的索引通常被分成多个分片,每个分片独立地计算聚合结果。由于数据在分…

BUU22 [护网杯 2018]easy_tornado 1

打开题目以后出现三个文件,查看源代码,突破口在于这三个文件都有特殊的格式 python的tornado漏洞 Tornado 是一个用 Python 编写的 Web 框架(和flask一样,只不过flask是轻量级的,而tornado可以处理高流量&#xff09…

QT修仙之路1-1--遇见QT

文章目录 遇见QT二、QT概述2.1 定义与功能2.2 跨平台特性2.3 优点汇总 三、软件安装四、QT工具介绍(重要)4.1 Assistant4.2 Designer4.3 uic.exe4.4 moc.exe4.5 rcc.exe4.6 qmake4.7 QTcreater 五、QT工程项目解析(作业)5.1 配置文件(.pro)5.2 头文件&am…

寒假2.5

题解 web:[网鼎杯 2020 朱雀组]phpweb 打开网址,一直在刷新,并有一段警告 翻译一下 查看源码 每隔五秒钟将会提交一次form1,index.php用post方式提交了两个参数func和p,func的值为date,p的值为Y-m-d h:i:s a 执行fu…

计算机中数值表示:原码、反码、补码与移码

1 前言 计算机科学中,数字的表示方式至关重要,因为计算机内部只能识别处理二进制数据。为了在计算机中实现对整数的表示,提出了多种数值编码方式,其中最常用的是原码、反码、补码和移码。 2 原码 2.1 原码的定义 原码(Signed …

硬件实现I2C常用寄存器简单介绍

引言 在深入探讨I2C外设的具体案例之前,理解其核心寄存器的配置至关重要。这些寄存器不仅控制着I2C模块的基本操作模式,如数据传输速率和地址识别,还负责管理更复杂的通信需求,例如中断处理、DMA交互及错误检测与恢复。接下来的内…

分析用户请求K8S里ingress-nginx提供的ingress流量路径

前言 本文是个人的小小见解,欢迎大佬指出我文章的问题,一起讨论进步~ 我个人的疑问点 进入的流量是如何自动判断进入iptables的四表?k8s nodeport模式的原理? 一 本机环境介绍 节点名节点IPK8S版本CNI插件Master192.168.44.1…