面试(03)————多线程

news2024/11/15 9:44:37

目录

一、线程和进程的区别?

二、并行和并发的区别? 

三、线程创建的方式有哪些? 

3.1、继承Thread类

3.2、实现Runnable接口

3.3、实现Callable接口

3.4、线程池

四、Runnable和Callable的区别?

五、在启动线程的时候,可以使用run方法吗?run()和start()有什么区别?

六、线程包含了哪些状态?状态之间是如何变化的?

七、新建T1、T2、T3三个线程,如何保证它们按顺序执行?

八、notify和notifyAll有什么区别?

九、Java中wait方法和sleep方法有什么不同?

十、如何停止一个正在运行的线程?

十一、synchronized关键字的底层原理

十二、Monitor实现的锁属于重量级锁。你了解过锁升级吗?

十三、谈谈JMM(Java内存模型)

十四、CAS

十五、乐观锁和悲观锁 

十六:谈谈你对volatile的理解 

十七、AQS 

 十八、ReentrantLock的实现原理

十九、synchronized和Lock有什么区别?

二十、死锁产生的条件?

二十一、如何进行死锁诊断?

二十二、ConcurrentHashMap

二十三、Java程序中怎么保证多线程的执行安全?(导致并发程序出现问题的根本原因是什么)

二十四、线程池的核心参数(线程池的执行原理)

二十五、线程池中有哪些常见的阻塞队列

二十六、如何确定核心线程数

二十七、线程池的种类有哪些

二十八、为什么不建议Executors创建线程池


一、线程和进程的区别?

进程:

  • 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的
     
  • 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。
     
  • 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360安全卫士等)

线程: 

一个进程之内可以分为一到多个线程。

一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU执行

Java中,线程作为最小调度单位,进程作为资源分配的最小单位。在windows中进程是不活动的,只是作为线程的容器

 

二、并行和并发的区别? 

并发是指系统具有处理多个任务的能力,但这并不意味着这些任务同时执行。在单核CPU的环境下,CPU通过在任务之间迅速切换(上下文切换),给人一种似乎是同时处理多个任务的错觉。因此,并发关注的是多个任务的启动、执行和完成的顺序,使得多个任务看似在“同时”执行,实际上从宏观角度是的,但从微观角度看,这些任务可能并没有在同一时刻被处理。

 

并行处理是指多个处理器或多核处理器同时处理多个任务。在这种情况下,任务确实是在同一时刻被执行。并行执行的目的是通过同时使用多个计算资源来减少程序的执行时间。它适用于那些可以被分解为可以独立执行的多个子任务的问题。

简单来说:

三、线程创建的方式有哪些? 

3.1、继承Thread类

3.2、实现Runnable接口

3.3、实现Callable接口

3.4、线程池

四、Runnable和Callable的区别?

五、在启动线程的时候,可以使用run方法吗?run()和start()有什么区别?

六、线程包含了哪些状态?状态之间是如何变化的?

线程的状态可以参考JDK中的Thread类中的枚举State

七、新建T1、T2、T3三个线程,如何保证它们按顺序执行?

八、notify和notifyAll有什么区别?

九、Java中wait方法和sleep方法有什么不同?

十、如何停止一个正在运行的线程?

十一、synchronized关键字的底层原理

十二、Monitor实现的锁属于重量级锁。你了解过锁升级吗?

十三、谈谈JMM(Java内存模型)

十四、CAS

CAS全程是:Compare And Swap(比较再交换),它体现的一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性。

 

在JUC包下实现的很多类都用到了CAS操作

比如:  AbstractQueuedSynchronizer(AQS框架)、AtomicXXX类

CAS数据交换流程: 

一个当前内存值V、旧的预期值A、即将更新的值B,当且仅当旧的预期值A和内存值V相同时,将内存值修改为B并返回ture,否则什么都不做,并返回false。如果CAS操作失败,通过自旋的方式等待并再次尝试,直到成功

十五、乐观锁和悲观锁 

乐观锁:

它假设不会产生冲突,先去尝试执行某项操作,失败了再进行其他处理(一般都是不断循环重试)。这种锁不会阻断其他线程,也不涉及上下文切换,性能开销小。代表实现是:CAS

悲观锁:

它假设一定会发生冲突,因此获取到锁之后会阻塞其他等待线程。这样做的好处是简单安全,但是挂起线程和回复线程都需要转入内核态进行,这样做的话会带来很大的性能开销。悲观锁的代表是synchronized。然而在真实环境中,大部分时候都不会产生冲突。

十六:谈谈你对volatile的理解 

总结:

十七、AQS 

全称是 AbstractQueueSynchronizer,即抽象队列同步器。它是构建锁或者其他同步组件的基础框架

AQS基本工作机制: 

在AQS内部有一个属性state,这个state就相当于一个资源,默认是0(无锁状态),如果队列中的有一个线程修改成功了state为1,则当前线程就相当于获取了资源

QS内部维护了一个先进先出的双向队列,队列中存储的排队的线程

在对state修改的时候使用的CAS操作,保证多个线程修改的情况下原子性

AQS可以是公平锁,也可以是非公平锁

公平锁是指各个线程在加锁前先检查有无排队的队列,按排队顺序取获得锁。(新的线程到队列中等待,只让队列中的head线程获取锁,是公平锁)

非公平锁是指线程加锁前不考虑排队问题,直接尝试获取锁,获取不到再去队尾排队。值得注意的是,在AQS的实现中,一旦线程进入排队队列,即使是非公平锁,线程也需要乖乖排队(新的线程与队列中的线程共同来抢资源,是非公平锁)

 十八、ReentrantLock的实现原理

ReentrantLock 内部有两个内部类,分别是 FairSync 和 NonFairSync,对应公平锁和非公平锁。他们都继承自 Sync。Sync 又继承自AQS。

总结:

十九、synchronized和Lock有什么区别?

二十、死锁产生的条件?

二十一、如何进行死锁诊断?

二十二、ConcurrentHashMap

总结:

二十三、Java程序中怎么保证多线程的执行安全?(导致并发程序出现问题的根本原因是什么)

volatile加在共享变量上!!

总结:

二十四、线程池的核心参数(线程池的执行原理)

二十五、线程池中有哪些常见的阻塞队列

二十六、如何确定核心线程数

二十七、线程池的种类有哪些

总结:

二十八、为什么不建议Executors创建线程池

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

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

相关文章

前端将xlsx转成json

第一种方式,用js方式 1.1先安装插件 万事都离不开插件的支持首先要安装两个插件 1.2. 安装xlsx cnpm install xlsx --save注:这块我用的cnpm,原生的是npm,因为镜像的问题安装了cnpm,至于怎么装网上一搜一大堆 1.3安…

阅读笔记:Multi-threaded Rasterization in the Chromium Compositor

Multi-threaded Rasterization in the Chromium Compositor PPT 原始链接: https://docs.google.com/presentation/d/1nPEC4YRz-V1m_TsGB0pK3mZMRMVvHD1JXsHGr8I3Hvc/edit?uspsharing PPT主要介绍了Chromium浏览器中使用多线程光栅化(Impl-side painting)的机制&a…

如何快速的将Excel定义的表结构变成MySQL的建表语句

如何快速的将Excel定义的表结构变成MySQL的建表语句 最近需求有点多啊,做一个小需求就有一堆表结构,一个一个实行CV大法,实在太伤身体了,有没有能够快速便捷的方法将一大堆Excel表转换成MySQL的表结构建表语句呢,网上…

Gmail 两步验证+应用专用密码登录

1、为什么做这个? 如果需要使用Gmail作为应用程序的邮件发送者,必须进行相关配置,否则不能直接使用 2、怎么做? 谷歌邮箱(gmail.com):两步验证应用专用密码登录 - 来发信 - 您的外贸拓客好帮…

递归在多级数据结构中的简单应用

哈喽,我是小码,半年多没更新了,这段时间换了新工作,工作也很忙。后续会尽量多写点,坚持确实是一件很难,很酷的事情。最近在公司负责开发商品有关的开发,商品包含类型、款式等属性,而…

从零开始发布你的第一个npm插件包并在多项目中使用

引言 在开源的世界里,每个人都有机会成为贡献者,甚至是创新的引领者。您是否有过这样的想法:开发一个解决特定问题的小工具,让她成为其他开发者手中的利器?今天,我们就来一场实战训练,学习如何将…

多链路聚合设备在自然灾害应急能力提升工程基层防灾项目内的应用

在近几年信息技术的飞速发展,面对应急通信和指挥调度时需要移动化无线通信技术来做支撑,多链路聚合设备在中间的作用至关重要,实现从车到车、人到车、车到中心的多样化应用场景进行数据图像的无线传输和多节点组网方案需求,来满足…

Linux[高级管理]——使用源码包编译安装Apache网站

🏡作者主页:点击! 👨‍💻Linux高级管理专栏:点击! ⏰️创作时间:2024年5月31日14点20分 🀄️文章质量:96分 在Linux系统上编译和安装Apache HTTP Server是…

乡村振兴与脱贫攻坚相结合:巩固拓展脱贫攻坚成果,推动乡村全面振兴,建设更加美好的乡村生活

目录 一、引言 二、巩固拓展脱贫攻坚成果 1、精准施策,确保稳定脱贫 2、强化政策支持,巩固脱贫成果 3、激发内生动力,促进持续发展 三、推动乡村全面振兴 1、加快产业发展,增强乡村经济实力 2、推进乡村治理体系和治理能力…

2.6倍!WhaleTunnel 客户POC实景对弈DataX

作为阿里早期的开源产品,DataX是一款非常优秀的数据集成工具,普遍被用于多个数据源之间的批量同步,包括类似Apache DolphinScheduler的Task类型也对DataX进行了适配和增强,可以直接在DolphinScheduler里面利用通用的数据源调用Dat…

Java面试——专业技能

优质博文:IT-BLOG-CN 一、简单讲下 Java 的跨平台原理 由于各个操作系统(Windows,Linux等)支持的指令集不是完全一致的。就会让我们程序在不同的操作系统上要执行不同的程序代码。Java 开发了适用于不同操作系统及位数的 Java 虚拟…

Python对获取数据的举例说明

当使用Python来获取数据时,有许多不同的方法和库可以根据你的需求来选择。以下是一些常见的示例,说明如何使用Python来从各种来源获取数据。 1. 从网站或API获取JSON数据 你可以使用requests库从网站或API获取JSON格式的数据。例如,从某个API…

C++ | Leetcode C++题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestConsecutive(vector<int>& nums) {unordered_set<int> num_set;for (const int& num : nums) {num_set.insert(num);}int longestStreak 0;for (const int& num : num_set) {…

accelerate 笔记:对齐不同设备配置的性能

在TPU、多GPU和单GPU上使用accelerate运行相同的脚本和相同的batch_size&#xff0c;可能结果是不一样的那应该怎么做呢? 1 设置正确的种子 确保在所有分布式情况下使用 utils.set_seed() 完全设置种子&#xff0c;以使训练可复现 from accelerate.utils import set_seedse…

【C++进阶】深入STL之string:模拟实现走进C++字符串的世界

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C模板入门 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之string &#x1f4d2;1. string…

男士什么牌子的内裤穿着舒服?五款实力派男士内裤分享

你是否曾因为内裤不透气、材质不佳而倍感烦恼&#xff1f;男士内裤作为贴身衣物&#xff0c;其舒适度和质量至关重要。在如今市场上品牌众多、材质各异的背景下&#xff0c;如何挑选一款合适的男士内裤成为了一大难题。 以下是测评过的部分男士内裤&#xff1a; 近期&#xff…

ArUco与AprilTag 标签

一、简介 在许多计算机视觉应用程序中&#xff0c;姿势估计非常重要&#xff1a;机器人导航&#xff0c;增强现实等等。 该过程基于发现真实环境中的点与其2d图像投影之间的对应关系。 这通常是一个困难的步骤&#xff0c;因此通常使用合成或基准标记来简化操作。 最受流行的…

20240606在Toybrick的TB-RK3588开发板的Android12下确认HDMI的驱动

20240606在Toybrick的TB-RK3588开发板的Android12下确认HDMI的驱动 2024/6/6 9:48 【原文是在RK3328的Android7.1下写的。我将它升级成为RK3588的Android12了】 RK平台主要采用 FB 和 DRM 两种显示框架。与此相对应&#xff0c; HDMI 也有两套驱动。 FB&#xff1a; LINUX 3.10…

技巧:合并ZIP分卷压缩包

如果ZIP压缩文件文件体积过大&#xff0c;大家可能会选择“分卷压缩”来压缩ZIP文件&#xff0c;那么&#xff0c;如何合并zip分卷压缩包呢&#xff1f;今天我们分享两个ZIP分卷压缩包合并的方法给大家。 方法一&#xff1a; 我们可以将分卷压缩包&#xff0c;通过解压的方式…

【CentOS 7】挑战探索:在CentOS 7上实现Python 3.9的完美部署指南

【CentOS 7】挑战探索&#xff1a;在CentOS 7上实现Python 3.9的完美部署指南 大家好 我是寸铁&#x1f44a; 总结了一篇【CentOS 7】挑战探索&#xff1a;在CentOS 7上实现Python 3.9的完美部署指南详细步骤✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 此篇教程只适用于p…