面试 Java 并发编程八股文十问十答第二期

面试 Java 并发编程八股文十问十答第二期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)形成死锁的四个必要条件是什么:

死锁是指多个线程或进程因相互竞争系统资源而陷入无限等待的状态。形成死锁的四个必要条件是:

  1. 互斥条件(Mutual Exclusion): 至少有一个资源是不可共享的,一次只能被一个线程占用。
  2. 请求与保持条件(Hold and Wait): 线程至少持有一个资源并请求其他线程占有的资源。
  3. 不可抢占条件(No Preemption): 系统不能抢占线程已经占有的资源,只能在线程自愿释放后才能被其他线程占用。
  4. 循环等待条件(Circular Wait): 多个线程形成循环等待资源的关系,每个线程都在等待下一个线程所占有的资源。

当这四个条件同时满足时,就会导致死锁的发生。

2)如何避免线程死锁:

避免线程死锁的方法主要包括以下几种:

  1. 避免使用多个锁: 尽量减少线程持有的锁的数量,避免多个锁之间互相依赖形成死锁。
  2. 按顺序获取锁: 规定线程获取锁的顺序,所有线程按照相同的顺序获取锁,可以避免循环等待的情况。
  3. 设置超时时间: 在获取锁时设置超时时间,如果超过一定时间无法获取到所需的锁,就主动释放已经获取的锁,避免长时间等待导致死锁。
  4. 死锁检测和处理: 建立死锁检测机制,及时发现死锁并采取相应的处理措施,如中断某个线程、回滚操作等。
  5. 资源分配图: 使用资源分配图等方法对资源的分配情况进行分析和规划,避免出现潜在的循环等待情况。

3)创建线程的四种方式:

在大多数编程语言和操作系统中,创建线程的方式主要有以下四种:

  1. 使用线程类或接口: 在面向对象的编程语言中,可以通过继承线程类或实现线程接口来创建线程,然后重写线程执行的逻辑。
  2. 使用线程库函数: 大多数操作系统提供了线程库函数,可以直接调用这些函数来创建线程,如pthread_create()函数用于在 POSIX 系统中创建线程。
  3. 使用线程池: 线程池是一种管理和复用线程的机制,可以提前创建一定数量的线程并放入线程池中,需要时从线程池中获取线程执行任务。
  4. 使用任务/执行器框架: 一些编程语言和框架提供了任务或执行器框架,可以将任务提交给执行器框架,由框架自动管理线程的创建和执行。

4)线程的 run() 和 start() 有什么区别?

  • run() 方法: run() 方法是线程类中定义的一个普通方法,用于线程的执行逻辑。当直接调用 run() 方法时,其实是在当前线程的上下文中执行 run() 方法的代码,而不会创建一个新的线程。
  • start() 方法: start() 方法是线程类继承自 Thread 类或实现 Runnable 接口后,调用 Thread 对象的方法,用于启动一个新的线程。调用 start() 方法会创建一个新的线程,并在新线程中执行 run() 方法中定义的逻辑。

5)为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?

  • 当调用 start() 方法时,会创建一个新的线程并在新线程中执行 run() 方法中定义的逻辑。这是因为 start() 方法会启动线程的生命周期,包括线程的启动、运行、休眠、唤醒和终止等过程。
  • 直接调用 run() 方法并不会创建一个新的线程,而是在当前线程的上下文中执行 run() 方法的代码。这样做会导致逻辑在当前线程中串行执行,而不会实现多线程并发执行的效果。
  • 因此,为了实现多线程并发执行,应该调用 start() 方法来启动新线程,让系统去调度新线程的执行,而不是直接调用 run() 方法。

6)什么是 FutureTask?

FutureTask 是 Java 中 java.util.concurrent 包提供的一个类,实现了 RunnableFuture 接口,同时也实现了 FutureRunnable 接口,可以作为一个 Runnable 被提交给 Executor 执行,也可以作为一个 Future 被用来获取异步执行的结果。

FutureTask 可以用来包装一个 CallableRunnable 对象,将其提交给线程池执行,并在将来的某个时刻获取执行结果。通过调用 get() 方法可以获取执行结果,如果任务还未完成,get() 方法会阻塞直到任务完成并返回结果。

FutureTask 提供了一种方便的方式来执行异步任务并获取结果,常用于多线程编程中需要获取异步任务执行结果的场景。

7)线程的状态和基本操作说说线程的生命周期及五种基本状态?

线程在 Java 中有以下五种基本状态:

  1. 新建状态(New): 当线程对象被创建但还未启动时,处于新建状态。
  2. 就绪状态(Runnable): 当线程对象被创建后,调用了 start() 方法,但还未获得 CPU 时间片时,处于就绪状态。
  3. 运行状态(Running): 当线程获得 CPU 时间片并开始执行时,处于运行状态。
  4. 阻塞状态(Blocked): 当线程被阻塞等待某个条件满足时,处于阻塞状态。
  5. 死亡状态(Terminated): 线程执行完任务或者异常终止时,处于死亡状态。

线程的生命周期包括:新建状态 -> 就绪状态 -> 运行状态 -> 阻塞状态 -> 运行状态 -> … -> 死亡状态。

8)Java 中用到的线程调度算法是什么?

Java 中使用的线程调度算法主要是抢占式调度算法。在抢占式调度中,操作系统会根据一定的策略(如优先级、时间片等)来决定当前哪个线程可以获得 CPU 时间片执行,当时间片用完或者发生阻塞等情况时,操作系统会重新调度其他线程执行。

9)线程的调度策略

线程的调度策略是操作系统根据一定的算法来决定哪个线程可以获得 CPU 时间片执行的策略。常见的调度策略包括:

  • 抢占式调度(Preemptive Scheduling): 操作系统可以主动中断当前线程的执行,将 CPU 时间片分配给其他线程执行。
  • 时间片轮转调度(Round-Robin Scheduling): 每个线程被分配一个时间片,当时间片用完后,操作系统将 CPU 时间片分配给下一个线程。
  • 优先级调度(Priority Scheduling): 根据线程的优先级来决定哪个线程可以获得 CPU 时间片执行,优先级高的线程会被优先执行。
  • 多级反馈队列调度(Multilevel Feedback Queue Scheduling): 根据线程的响应时间等因素动态调整线程的优先级,以提高系统的整体性能。

10)什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing)?

  • 线程调度器(Thread Scheduler): 线程调度器是操作系统的一部分,负责决定在多个线程之间如何分配 CPU 时间片。线程调度器根据线程的优先级、调度策略等来决定哪个线程可以获得 CPU 时间片执行。
  • 时间分片(Time Slicing): 时间分片是指操作系统将 CPU 时间分成若干个时间片段,每个线程被分配一个时间片段,当时间片用完后,线程会被暂停,操作系统会重新调度其他线程执行。时间分片可以保证每个线程都有机会执行,并避免某个线程长时间占用 CPU 导致其他线程无法执行的情况。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端总计已经 700+ Star,1W+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐

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

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

相关文章

《HTTPS协议》

文章目录 一、什么是HTTPS协议二、理解关键字三、为什么要加密四、常见的加密方式1.对称加密2.非对称加密 五、如何进行加密?1.只使用对称加密2.只使用非对称加密3.双方都使用非对称加密4.使用对称加密非对称加密5.对称加密非对称加密CA证书认证5.1数据摘要&#xf…

GPT-4-turbo还是大家心中第一!Claude 3竞技场人类投票成绩出炉:仅居第三

Claude 3的竞技场排名终于揭晓了: 在仅仅3天的时间里,20000张投票使得排名的流量达到了前所未有的高度。 最后,Claude 3的"大杯"模型Opus以1233的分数赢得了胜利,成为了第一个能和GPT-4-Turbo匹敌的选手。 "中杯…

Flink 资源管理

文章目录 前言ResourceManager详解Slot 管理器SlotProviderSlot资源池Slot共享Slot共享的优点Slot 共享组与 Slot 共享管理器Slot资源申请 总结 前言 在Flink中,资源管理是一个核心组件,它负责分配和管理计算资源,以确保任务能够高效、稳定地…

Python使用Beautiful Soup及解析html获取元素并提取内容值

Python使用Beautiful Soup及解析html获取元素并提取内容值 1. 包括解析获取标题2. 根据标签及id获取所有元素3. 根据标签及class获取所有元素4. 获取元素下的标签的值5. 获取元素下的parent及child的元素的值参考 1. 包括解析获取标题 2. 根据标签及id获取所有元素 3. 根据标…

QGridLayout网格布局和QVBoxLayout垂直布局有着非常大的差别

QGridLayout网格布局:1.把这块控件划分成一个个的 单元格 2.把你的控件填充进入 单元格 3.这些有关限制大小的函数接口统统失效 setMaximumWidth() setMinimumWidth() setPolicySize()图示:我是用的网格布局,左边放QT…

C# WinForm AndtUI第三方库 Table控件使用记录

环境搭建 1.在NuGet中搜索AndtUI并下载至C# .NetFramework WinForm项目。 2.添加Table控件至窗体。 使用方法集合 1.单元格点击事件 获取被点击记录特定列内容 private void dgv_CellClick(object sender, MouseEventArgs args, object record, int rowIndex, int columnIn…

观察者模式:Java 中的一对多依赖关系解决方案

观察者模式是一种行为设计模式,用于定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于解耦发布者和订阅者,使得系统更易于扩展和维护。 使用条件 观察…

【Python】装饰器函数

专栏文章索引:Python 原文章:装饰器函数基础_装饰函数-CSDN博客 目录 1. 学习装饰器的基础 2.最简单的装饰器 3.闭包函数装饰器 4.装饰器将传入的函数中的值大写 5. 装饰器的好处 6. 多个装饰器的执行顺序 7. 装饰器传递参数 8. 结语 1. 学习装饰…

C/C++蓝桥杯之整除序列

问题描述:有一个序列,序列的第一个数是n,后面的每个数均是前一个数整除2的结果,请输出这个序列中值为正数的所有项。 输入格式:输入一行,包含一个整数n。 输出格式:输出一行,包含多…

利用IDEA创建Java项目使用Servlet工具

【文件】-【项目结构】 【模块】-【依赖】-【】-【JAR】 找到Tomcat的安装路径打开【lib】找到【servlet.jar】点击【确定】 勾选上jar,然后【应用】-【确定】 此时新建文件可以发现多了一个Servlet,我们点击会自动创建一个继承好的Servlet类

计算机等级考试:信息安全技术 知识点三

1、拨号用户远程认证服务(Remote Authentication Dial-In User System,RADIUS)是一个网络协议,提供集中式AAA管理 2、在Windows NT里,口令字密文保存在SAM文件。 3、tracert是操作系统提供的命令。 4、Rootkit是一种内核隐藏技术&#xff…

STL容器之哈希的补充——其他哈希问题

1.其他哈希问题 ​ 减少了空间的消耗; 1.1位图 ​ 位图判断在不在的时间复杂度是O(1),速度特别快; ​ 使用哈希函数直接定址法,1对1映射; ​ 对于海量的数据判断在不在的问题,使用之前的一些结构已经无法满足&…

基于PSO粒子群算法的三角形采集堆轨道优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 假设一个收集轨道,上面有5个采集堆,这5个采集堆分别被看作一个4*20的矩阵(下面只有4*10),每个模块&…

【python3】多进程Pipe实现数据流模型

当涉及到数据流模型时,常见的方法是使用管道(Pipe)来实现进程间的通信。在数据流模型中,计算过程表示为数据流图,数据从一个节点流向另一个节点,并在节点之间进行转换和处理。 以下是一个稍微复杂一些的数…

opencv编程

opencv编程 引言: ​ 本实验旨在介绍使用OpenCV进行图像处理和视频处理的基本操作。OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,提供了丰富的图像和视频处理功能,既可以进行图像的读取、显示…

187基于matlab的弹道目标跟踪滤波方法

基于matlab的弹道目标跟踪滤波方法,扩展卡尔曼滤波(extended Kalman filter, EKF)、转换测量卡尔曼滤波(conversion measurement Kalman filter, CMKF)跟踪滤波,得到距离、方位角、俯仰角误差结果。程序已调…

llama2c(3)之tokenizer和encode

2、tokenizer和编码 2.1 tokenizer tokenizer的model不同于Transformer的model,Transformer的model是一些权重参数,tokenizer的model是一些分词,将一个句子分成分词的中介(模型)。,具体就是tokenizer.py文…

c 不同类型指针的转换

int 指针与unsigned char类型指针互转 #include <stdio.h> #include <stdlib.h>int main(void){int a(0x1<<24)|(0x2<<16)|(0x3<<8)|0x4; //0x1020304printf("16进制:%x\n",a);u_int8_t *p(u_int8_t *)&a; //int指针转为unsig…

人工智能|机器学习——DBSCAN聚类算法(密度聚类)

1.算法简介 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法&#xff0c;簇集的划定完全由样本的聚集程度决定。聚集程度不足以构成簇落的那些样本视为噪声点&#xff0c;因此DBSCAN聚类的方式也可以用于异常点的检测。 2.算法原…

Spring AOP基于注解方式实现

1. 场景介绍 目前假设我们有一个计算器类&#xff0c;并要为其中的方法添加日志功能。 计算器类如代码所示&#xff1a; public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j);}public class Calculator…