Java并发编程面试题

news2024/11/25 1:51:37

一、线程、进程、程序

进程: 我们把运行中的程序叫做进程,每个进程都会占用内存与CPU资源,进程与进程之间互相独立.

线程: 线程就是进程中的一个执行单元,负责当前进程中程序的执行。一个进程可以包含多个线程。多线程可以提高程序的并行运行效率。

程序:是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。

二、线程状态

1.新建(New):创建线程对象时

2.就绪(Runnable):线程调用start方法,有执行资格没有执行权

3.运行:当就绪状态时抢到cpu的执行权之后,进入运行状态

4.阻塞(Blocked):当获取锁失败后,进入阻塞状态

5.等待(Waiting):等待被notify()方法唤醒

6.休眠(sleep):休眠一段时间,时间到了之后,进入就绪状态。

7.终止(Terminated):线程死亡

 三、线程的七大参数

1.核心线程数(corePoolSize):表示保持活动状态的最小线程数。

2.最大线程数(maximumPoolSize):表示允许创建的最大线程数。

3.空闲时间(keepAliveTime):表示当线程数量超过核心线程数时,多余的空闲线程能够保持存活的时间。

4.阻塞队列(workQueue):表示用于存储等待执行的任务的阻塞队列。

5.单位(unit):表示空闲时间的单位,例如毫秒、秒等。

6.拒绝策略(rejectedExecutionHandler):表示当任务无法提交给线程池执行时采取的策略。

当线程任务进来时,首先尝试创建核心线程进行执行。如果线程池中的线程数量已经达到了核心线程数,

并且阻塞队列也已经满了,那么就会尝试创建新的线程进行执行。

如果线程池中的线程数量已经达到了最大线程数,并且阻塞队列也已经满了,那么就会执行拒绝策略。

示例:假设线程池的核心线程数为 10,最大线程数为 20,阻塞队列容量为 50,

则当有 100 个任务进入线程池时,会有 10 个核心线程立刻执行任务,50 个任务进入阻塞队列,

再有 10 个线程被创建并立即执行剩余的任务。最后还剩下 30 个任务无法执行,就会被拒绝执行。

四、线程有什么优缺点?

优点:

1. 在多核CPU中,通过并行计算提高程序性能. 比如一个方法的执行比较耗时,现在把这个方法逻辑拆分,分为若干个线程并发执行,提高程序效率。

2. 可以解决网络等待、io响应导致的耗时问题

3. 提高CPU的使用率.提高网络资源的利用率

缺点:

1. 线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;

2. 线程之间对共享资源的访问会造成资源安全问题;

3. 多线程存在上下文切换问题CPU 通过时间片分配算法来循环执行任务,所以本身就会占用cpu资源

五、start 和 run 方法有什么区别?

        调用start方法方可启动线程,而run方法只是thread类中的一个普通方法调用,还是在主线程里执行。

六、wait 和 sleep的区别?

相同点:wait(long) 和 sleep(long) 的效果都是让当前线程暂时放弃 CPU 的使用权,进入阻塞状态

不同点:

sleep是Thread的静态方法,而 wait()都是 Object 的成员方法,每个对象都有。

sleep方法是暂停当前线程,相当于休眠一段时间,之后会自动唤醒,而wait()必须被notify 或者notifyall方法唤醒,不然会一直阻塞。

wait方法的调用必须先获取wait对象的锁,而sleep则无此限制wait方法执行后会释放对象锁

 允许其它线程获得该对象锁(我放弃 cpu,但你们还可以用);如果在 synchronized代码块中执行,并不会释放对象锁(我放弃 cpu,你们也用不了)。

七、lock与synchronized的区别

语法层面:

1.synchronized是关键字,源码在jvm中,用c++ 语言实现

2..Lock 是接口,源码由jdk 提供,用java语言实现

3.使用 synchronized 时,退出同步代码块锁会由jvm自动释放,而使用Lock时,需要手动调用unlock方法释放锁,否则可能会导致死锁等问题。

功能层面

1. Lock 提供了更多的锁机制选择,例如公平锁、非公平锁、可重入锁、读写锁等多种类型;而 synchronized 只有一种类型,即独占锁(排他锁)。

2. Lock 应该优先考虑在高并发场景下使用,可以获得更好的性能和灵活性;而 synchronized 关键字则更适合用于简单的线程同步场景,易于使用和维护。

八、Volatile关键字是线程安全的吗?底层原理是什么?

什么是重排序?

        当一个变量被修改后,如果该变量的值没有被写入到主内存中,其他线程可能会读取到该变量的旧值,导致程序出错。

并发编程中有3大重要特性:

原子性

一个操作或者多个操作,要么全部执行成功,要么全部执行失败。满足原子性的操作,中途不可被

中断。

可见性

多个线程共同访问共享变量时,某个线程修改了此变量,其他线程能立即看到修改后的值。

有序性

        程序执行的顺序按照代码的先后顺序执行。(由于JMM模型中允许编译器和处理器为了效率,进行指令重排序的优化。指令重排序在单线程内表现为串行语义,在多线程中会表现为无序。那么多线程并发编程中,就要考虑如何在多线程环境下可以允许部分指令重排,又要保证有序性)

那么volatile关键字是如何保证可见性和有序性呢?

保证可见性:当一个变量被volatile修饰后,JVM会把工作内存中的最新变量值强制刷新到主内存中,会导致其他线程中的缓存失效。这样,其他线程使用缓存时,发现本地工作内存中此变量失效,便会从主内存中获取,这样获取到的值就是最新的值,实现了线程可见性

 

保证有序性:通过编译器在生成字节码时,在指令序列中添加“内存屏障”来禁止指令重排序的,从而保证了有序性。(屏蔽在多线程环境下CPU的指令重排)

总之,Volatile关键字可以保证可见性和有序性,但不保证原子性,因此volatile不是线程安全的。

九、synchronized作用和底层原理?

1.Java关键字synchronized是用于实现多线程同步的机制,确保多个线程在访问共享资源时不会产生竞争和冲突,从而避免数据不一致的情况。其主要原理是基于Java对象的内部锁,即监视器锁(Monitor Lock),确保在同一时刻只有一个线程可以访问被保护的代码块或方法

2.当一个线程尝试获取被synchronized关键字保护的资源时,如果该资源已被其他线程占用,该线程就会进入阻塞等待状态。当占用资源的线程释放该资源时,等待队列中的线程会竞争获取该资源,并且只有一个线程会成功获取到该资源,其他线程继续等待。

3.synchronized关键字保证了可见性和原子性,可见性是通过JVM底层的内存屏障来实现的,原子性则是通过监视器锁的互斥性来实现的。

在synchronized块内,线程获得了锁,它将会清空工作内存,从而使得该线程使用的变量能够从主内存中重新读取,同时也会把工作内存中的变量写回到主内存中。这样,其他线程就可以读取到最新的值,从而保证了可见性。

十一、ThreadLocal是线程安全的吗?底层原理是什么?会存在内存泄露吗?

弱引用:只要垃圾回收机制一运行,不管 JVM 内存空间是否充足,都会回收该对象占用的内存。

ThreadLocal:为共享变量在每个线程中创建一个副本,每个线程都可以访问自己内部的副本变量。通过 threadlocal 保证线程的安全性

在 ThreadLocal 类中有一个静态内部类 ThreadLocalMap(其类似于 Map),用键值对的形式存储每一个线程的变量副本,ThreadLocalMap 中元素的 key 为当前ThreadLocal 对象,而 value 对应线程的变量副本。ThreadLocal 本身并不存储值,它只是作为一个 key 保存到 ThreadLocalMap中,但是这里要注意的是它作为一个 key 用的是弱引用,因为没有强引用链,弱引用在 GC的时候可能会被回收。这样就会在 ThreadLocalMap 中存在一些key为null的键值对(Entry)。因为 key 变成 null 了,我们是没法访问这些 Entry 的,但是这些 Entry 本身是不会被清除的。如果没有手动删除对应 key 就会导致这块内存即不会回收也无法访问,也就是内存泄漏。使用完 ThreadLocal之后,记得调用 remove方法。

1.每个Thread维护一个ThreadLocalMap,这个ThreadLocalMap的key是ThreadLocal实例本身,value才是真正要存储的值Object

2.每个Thread线程内部都有一个ThreadLocalMap,Map里面存储ThreadLocal对象(key)和线程的变量副本(value)

3.Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值

4.对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离,互不干扰。

注意:在不使用线程池的前提下,即使不调用 remove 方法,因此是ThreadLocal是弱引用,线程的"变量副本"也会被gc回收,即不会造成内存泄漏的情况。

十二、1HashMap和ConcurrentHashMap有什么区别?

首先HashMap和ConcurrentHashMap都是Map接口的实现类。可以从以下三个方面分析它们的区别:

线程安全方面:由于HashMap没有加锁机制,线程不安全;ConcurrentHashMap内部加了分段锁线程安全

并发性能:由于ConcurrentHashMap采用了分段锁机制,因此可以支持多个线程同时进行读写操作,并且在高并发的场景下性能更好。而HashMap默认没有加锁,需要手动加锁,如果多个线程同时修改同一个HashMap对象,可以会出现锁竞争条件和死锁问题。

底层数据结构不同:HashMap底层使用数组+链表+红黑树,而ConcurrentHashMap底层使用分段锁(segment)机制实现。

ConcurrentHashMap底层分段锁原理

JDK1.7的时候:ConcurrentHashMap为保证线程安全,使用的是分段锁机制--->首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当线程占用锁访问的数据时,其他段数据也能访问。但是,这种方式在高并发场景下仍然存在性能瓶颈,因为多个线程仍然需要竞争同一个锁

JDK1.8之后:为提高效率,放弃了分段锁的设计,取代的是Node+CAS+Synchronized保证并发安全实现,ConcurrentHashMap将底层数据结构分成了多个小的桶(Segment),每个桶都维护了一个独立的哈希表,不同的线程可以同时访问不同的桶,从而避免了多个线程竞争同一个锁的情况,提高了并发性能和效率。syschronized只锁当前链表或红黑树的首节点,只要hash不冲突,效率就提高了。

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

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

相关文章

Stable Diffusion 常用主流checkpoint模型

AbyssOrangeMix2 https://civitai.com/models/4437/abyssorangemix2-sfwsoft-nsfw dosmix https://civitai.com/models/6250/dosmix Counterfeit-V3.0 https://civitai.com/models/4468/counterfeit-v30 万象熔炉 | Anything V5/Ink QteaMix 通用Q版模型 https://civitai.c…

Spring Boot 中的监控及使用

Spring Boot 中的监控及使用 Spring Boot 是一个非常流行的 Java 应用程序开发框架,它提供了一种快速构建应用程序的方法。除此之外,Spring Boot 还提供了一系列的监控功能,方便开发人员对应用程序进行监控和管理。本文将讨论 Spring Boot 中…

MachineLearningWu_第1+2章_SupervisedLearningUnsupervisedLearning

x.1 笔记 常见Supervised Learning的app,会有input和label 线性拟合做回归, 分类问题如下,当单个输入但是多个类别信息时可以简化为单轴向, 当分类问题是多输入时,可以简化为特征空间如下, *无监督算法的核…

SiLM27624系列 双通道30V, 5A/5A高速低边门极驱动器介绍

在开关电源系统中,需要利用门极驱动器来有效地驱动功率器件,实现功率器件的快速开关,以减少开关功率损耗、提高系统效率。在 GaN 等新兴的宽带隙功率器件技术中,需要快速的传输延时、精准的延迟匹配、极强的驱动能力以满足系统中高…

移动隔断地板无轨道,只需将轨道安装于天花板上

移动隔断地板无轨道设计可以提供更加灵活的空间划分和布局选择。相较于传统的固定轨道系统,只需将轨道安装在天花板上,就能实现移动隔断的收放和推动。这种设计可以避免地板上的轨道对于日常活动和清洁的干扰,并且减少了地板安装的复杂性。 在…

HDLBits刷题笔记9:Circuits.Sequential Logic.Counters + Shift Registers

Counters Four-bit binary counter module top_module (input clk,input reset, // Synchronous active-high resetoutput reg [3:0] q);always (posedge clk) beginif(reset)q < 0;elseq < q 1;end endmoduleDecade counter 建立一个计数器&#xff0c;从0计数…

二分类结局变量Logistic回归临床模型预测—— 外部数据集验证

1. 介绍 2. 基线特征 3. 单因素多因素logistic回归分析及三线表 4. 构建临床列线图模型 5. 模型评价 6. 外部数据集验证 7. 另一种发文章的办法,分训练集和测试集,分析上述3-6节的内容 外部数据集验证,就是找一个别的数据集,可以是别家医院的,也可是数据库的,但是…

机器视觉初步12:C#入门初步(有代码示例)

文章目录 基础部分概述1. 变量&#xff1a;2. 数据类型&#xff1a;3. 运算符&#xff1a;4. 控制语句&#xff1a;5. 字符串和数组&#xff1a;6. 类型转换&#xff1a;7. 输出和输入&#xff1a;8. 变量命名&#xff1a;9. 函数&#xff1a;10. 枚举值的比较&#xff1a;11. …

红旗软件与派盘互认证成功

近年来,随着数据的不断增长和扩张,云计算、大数据、人工智能等技术已成为数字化转型的推动力。在这个背景下,红旗软件和派盘之间的互认证也成为了企业用户进行数据备份和管理的理想选择。 红旗软件是由中国科学院成立的软件公司,其主要产品有红旗Linux操作系统、红旗开发工…

今日分享简单的下划线转驼峰方法

简单的下划线转驼峰方法… #代码片段分享# function underLine2CamelCase(string){return string.replace( /_([a-z])/g, function( all, letter ) {return letter.toUpperCase();}); }

为什么空间坐标系之间的线性变换关系 = 坐标轴向量堆叠?

相机模型存在4个坐标系&#xff1a;世界坐标系、摄像机坐标系、图像物理坐标系和图像像素坐标系。 光心&#xff1a;图像的中心。 光轴&#xff1a;穿过图像的光心&#xff0c;与图像平面垂直的轴。 世界坐标系(Xw,Yw,Zw)&#xff1a;是客观三维世界的绝对坐标系&#xff0c…

【二叉排序树(也叫二叉搜索树)本质就是中序遍历是有序的二叉树】一道题讲解二叉排序树的本质,以及操作代码(通俗易懂的总结帮助理解操作)

1. 二叉排序树&#xff08;中序遍历是有序的&#xff09; 解释一下删除操作的第三点&#xff1a; 首先我们要清楚&#xff1a; 二叉排序树的特点是 中序遍历&#xff08;左根右&#xff09;是有序的 所以如果删除的根节点有左右子树 那么我们为了保证有序 就要把 根节点左子…

Arm64架构(MacBookPro M1)虚拟机安装k8s1.27.3版本记录及问题总结

目录 一、介绍二、安装前设置2.1 设置hostname2.2 关闭防火墙2.3 关闭selinux2.4 关闭swap2.5 允许 iptables 检查桥接流量2.6 安装Docker 三、安装container runtime3.1 安装containerd3.2 安装cri-docker 四、安装k8s集群4.1 配置aliyun的kubernetes yum源4.2 下载 kubelet k…

RTL8309M实现VLAN功能-驱动编进内核

部分硬件实现图 一、使内核支持802.1Q功能 1、使用内核kernel版本4.19.232 2、make menuconfig 配置内核 3、进入Networking support 4、进入Networking options 5、把这些都编进内核 6、点击保存退出 CONFIG_GARPy CONFIG_MRPy CONFIG_BRIDGE_VLAN_FILTERINGy CONFIG_VLAN…

2023年6月第4周大模型荟萃

2023年6月第4周大模型荟萃 2023.6.30版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、腾讯云首次公布大模型进展 6月19日&#xff0c;腾讯云召开行业大模型及智能应用技术峰会&#xff0c;首次公布腾讯云行业大模型研发进展&#xff0…

自定义MVC的初步实现

文章目录 前言一、 工作流程图二、简单的实现自定义MVCController层——Servlet中央控制器子控制器具体Action类 view层——JSP 三、初步实现自定义MVC简单MVC架构中的问题3.1 配置XML文件3.2 建模3.2 Servlet3.3 jsp 前言 在上一篇博客&#xff0c;我们介绍了MVC的演变过程&a…

华为、华三、锐捷、飞塔、山石的抓包命令

一、华为的抓包命令 1、基本概念 华为的抓包行为称之为镜像端口&#xff0c;也就是说将需要抓取的接口上&#xff08;称为镜像端口&#xff09;的流量复制一份到另一个接口上&#xff08;工程师进行流量观察的端口&#xff0c;称为观察端口&#xff09;&#xff0c;如下图所示…

23年hadoop单机版+hive

文章目录 说明分享环境信息安装jdkhadoop配置core-site.xml mysqlhive安装配置hive-site.xml配置hive-env初始化mysql数据库启动验证hive命令hiveserver2方式 总结 说明 工作需要研究hive功能&#xff0c;线上环境不能动&#xff0c;搭建单机版hadoophive测试环境&#xff0c;使…

pyodbc读取.mdb文件时出现[ODBC Microsoft Access Driver] 网络访问已中断。请关闭数据库.....解决方法

在使用pyodbc读取.mdb文件时出现下面的错误 : ODBC Microsoft Access Driver] 网络访问已中断。若要继续&#xff0c;请关闭数据库&#xff0c;然后再将其打开。 (-1022) (SQLDriverConnect) 网上找了很多方法&#xff0c;最后通过下面的方法解决了&#xff0c;就是安装64位的…

搜索团队的技术小结

搜索业务形态 CSDN作为开发者内容中心&#xff0c;主要通过分发博客和商业产品&#xff08;下载资源&#xff09;满足用户碎片化学习需求&#xff1b;产品形态上通过以下3种方式来承接用户需求 1. 站内搜索框 2. 博客相关推荐 3. 下载相…