Java并发自测题

文章目录

  • 一、什么是线程和进程?线程与进程的关系,区别及优缺点?
  • 二、为什么要使用多线程呢?
  • 三、说说线程的生命周期和状态?
  • 四、什么是线程死锁?如何预防和避免线程死锁?
  • 五、synchronized 关键字
  • 六、并发编程的三个重要特性
  • 七、JMM (Java Memory Model,Java 内存模型)和 happens-before 原则。
  • 八、volatile 关键字
  • 九、ThreadLocal 关键字
  • 十、ReentrantLock 和 AQS
  • 十一、乐观锁和悲观锁的区别
  • 十一、CAS 了解么?原理?什么是 ABA 问题?ABA 问题怎么解决?
  • 十二、Atomic 原子类


一、什么是线程和进程?线程与进程的关系,区别及优缺点?

提示:可以从从 JVM ⻆度说进程和线程之间的关系
首先说进程,进程其实就是程序的一次执行的过程。而线程与进程相似但是线程是比进程更小的单位。一个进程在其执行的过程中可以产生多个线程。线程是程序内部的一条执行路径,是程序中的一个单一的顺序控制流程。可以认为是进程里的一条执行路径。

区别:
在这里插入图片描述
从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的堆和方法区 (JDK1.8 之后的元空间)资源,但是每个线程有自己的程序计数器、虚拟机栈 和 本地方法栈。

总结: 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。


二、为什么要使用多线程呢?

提示:从计算机⻆度来说主要是为了充分利⽤多核 CPU 的能⼒,从项⽬⻆度来说主要是为了提升系统的性能。

首先我们从计算机底层来说,线程可以比作是轻量级的进程,是程序执行的最小单位,线程之间的切换和调度的成本远远小于进程。另外,多核cpu时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。其次对于现在互联网发展的趋势来说, 现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。


三、说说线程的生命周期和状态?

提示: 6 种状态( NEW 、 RUNNABLE 、 BLOCKED 、 WAITING 、 TIME_WAITING 、 TERMINATE D )。

线程的生命周期是由六种不同的状态的,首先线程被创建变为初始状态,线程调用start方法变成运行状态,在运行会发生阻塞或者等待,其中等待状态有两种分别是等待状态和超时等待状态,其中等待状态是表示该线程需要等待其他线程做出一些特定动作(通知或中断)。超时等待状态是在指定的时间后自行返回而不是像等待那样一直等待。阻塞状态是需要等待锁释放。最后是终止状态,表示该线程已经运行完毕了。


四、什么是线程死锁?如何预防和避免线程死锁?

这⾥最好能够结合代码来聊,你要确保⾃⼰可以写出有死锁问题的代码。

所谓线程死锁其实就是多个线程同时被阻塞,它们中的一个或者其他全部都在等待某个资源释放。由于线程无限期被阻塞,因此程序不能正常被终止。

其实预防死锁的方式只需要破坏产生死锁的必要条件即可,第一个破坏请求与保持条件(一次性申请所有的资源),第二个破坏不可剥夺条件(占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它所占有的资源),第三个破坏循环等待条件(靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。)

避免死锁就是在资源分配时,借助于算法(比如银行家算法)对资源分配进行计算评估,使其进入安全状态。


五、synchronized 关键字

提示: synchronized 关键字⼏乎是⾯试必问,你需要搞懂下⾯这些 synchronized 关键字相关的问题: 1.synchronized 关键字的作⽤,⾃⼰是怎么使⽤的。2.synchronized 关键字的底层原理(重点!!!)3.JDK1.6 之后的 synchronized 关键字底层做了哪些优化。 synchronized 锁升级流程。4.synchronized 和 ReentrantLock 的区别。5.synchronized 和 volatile 的区别。

首先,synchronized关键字翻译成中文是同步的意思,主要解决的是多个线程之间访问资源的同步性,被它修饰的方法或者代码块在任意时刻只能有一个线程执行。该关键字的使用方式主要用于三个地方分别是:1.修饰实例方法 2.修饰静态方法 3.修饰代码块

底层原理 跟JVM中的对象监视器 monitor 有关。
synchronized 同步语句块的实现使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置。
synchronized 修饰的方法并没有 monitorenter 指令和 monitorexit 指令,取得代之的确实是 ACC_SYNCHRONIZED 标识,该标识指明了该方法是一个同步方法。

.synchronized 和 ReentrantLock 的区别:ReentrantLock 实现了 Lock 接口,是一个可重入且独占式的锁,和 synchronized 关键字类似。不过,ReentrantLock 更灵活、更强大,增加了轮询、超时、中断、公平锁和非公平锁等高级功能。

synchronized 与volatile 区别在于,它们两个关键字是互补的存在,volatile 关键字是线程同步的轻量级实现,所以 volatile性能肯定比synchronized关键字要好 。但是 volatile 关键字只能用于变量synchronized 关键字可以修饰方法以及代码块 。其次volatile 关键字可以保证数据的可见性,但不能办证数据的原子性。Synchronized都可以保证。volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized 关键字解决的是多个线程之间访问资源的同步性


六、并发编程的三个重要特性

提示: 原⼦性、可⻅性、有序性
分别是原子性、可见性、有序性。原子性是一次操作或者多次操作,要么所有的操作全部都得到执行并且不会受到任何因素的干扰而中断,要么都不执行。在 Java 中,可以借助synchronized、各种 Lock 以及各种原子类实现原子性。synchronized 和各种 Lock 可以保证任一时刻只有一个线程访问该代码块,因此可以保障原子性。
可见性是当一个线程对共享变量进行了修改,那么另外的线程都是立即可以看到修改后的最新的值的。
有序性是保证指令不会受cpu指令并行优化(指令重排)的影响,由于指令重排序问题,代码的执行顺序未必就是编写代码时候的顺序。


七、JMM (Java Memory Model,Java 内存模型)和 happens-before 原则。

JMM模型是java内存模型,可以把 JMM 看作是 Java 定义的并发编程相关的一组规范,除了抽象了线程和主内存之间的关系之外,其还规定了从 Java 源代码到 CPU 可执行指令的这个转化过程要遵守哪些和并发相关的原则和规范,其主要目的是为了简化多线程编程,增强程序可移植性的。
happens-before 原则是一种规则,用于区分事件发生的前后顺序。


八、volatile 关键字

提示: volatile 关键字同样是⼀个重点!结合 JMM (Java Memory Model,Java 内存模型)和 happens-before 原则来回答就⾏了。

volatile 关键字能保证数据的可见性,但不能保证数据的原子性。synchronized 关键字两者都能保证。


九、ThreadLocal 关键字

提示:关注 ThreadLocal 的底层原理、内存泄露问题以及⾃⼰是如何在项⽬中使⽤ ThreadLocal 关键字的。

通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢?

JDK 中自带的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。ThreadLocal 就是用来避免这两个线程竞争的。


十、ReentrantLock 和 AQS

提示: ReentrantLock 的特性、实现原理(基于 AQS )。可以从 ReentrantLock 的实现来理解 AQS

ReentrantLock 和 AbstractQueuedSynchronizer(AQS) 是 Java 并发编程中的重要概念。
ReentrantLock 是一个可重入的互斥锁,由 Java 并发包中的 java.util.concurrent.locks.ReentrantLock 类实现。"可重入"意味着一个线程可以多次获取同一把锁,这在需要多次进入临界区的情况下非常有用。ReentrantLock 提供了与 synchronized 关键字类似的功能,但比 synchronized 更加灵活,因为它可以尝试获取锁(如果锁不可用,那么立即返回,而不是阻塞),并且可以中断等待锁的线程。
AbstractQueuedSynchronizer(AQS) 是 Java 并发包中的一个框架,用于构建依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量,事件,等待/通知等)。它使用一个整数状态表示获取或释放锁,子类需要定义改变这个状态的方法。ReentrantLock 就是基于 AQS 实现的。
AQS 通过内部的 FIFO 队列来管理阻塞的线程。如果请求的锁没有被其他线程持有,那么请求的线程可以成功获取锁;否则,这个线程就会被放入队列中,直到有其他线程释放锁为止。
总的来说,ReentrantLock 和 AQS 都是构建高效并发应用的重要工具,它们提供了一种更细粒度的锁控制方式,使得开发者能够更好地控制并发行为。


十一、乐观锁和悲观锁的区别

悲观锁::悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。

乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。


十一、CAS 了解么?原理?什么是 ABA 问题?ABA 问题怎么解决?

提示:多地⽅都⽤到了 CAS ⽐如 ConcurrentHashMap 采⽤ CAS 和 synchronized 来保证并发安全,再⽐如 java.util.concurrent.atomic 包中的类通过 volatile+CAS 重试保证线程安全性。和⾯试官聊 CAS 的时候,你可以结合 CAS 的⼀些实际应⽤来说。

CAS,全称Compare And Swap,是一种无锁算法。在不使用传统锁的情况下,它通过比较内存中的值和预期值来决定是否更新内存中的值。基本操作是这样的:它包含三个参数CAS(V,E,N),V表示要更新的变量,E表示预期值,N表示新值。如果V值等于E值,则将V的值设为N。如果V值与E值不相等,则说明其他某个线程已经改变了V的值,那么本次操作就会失败。

ABA问题是CAS操作中可能会遇到的一个问题。假设V原来的值是A,它被线程1获取,就在这时,线程2也访问了V,将V的值由A改成B,然后又改回A,此时线程1进行CAS操作发现V的值仍然为A,然后线程1以为V的值没有被修改过,然后进行CAS操作,但实际上,V的值已经被线程2改变过了,这就是所谓的ABA问题。

对于ABA问题,一个常见的解决方案是使用版本号。在每次变量更新的时候,都把版本号加一,这样,即使A变成B,然后又变回A,版本号也会改变,这样就可以防止ABA问题。在Java中,AtomicStampedReference类就实现了这样的功能,它通过包装[E, S]对进行操作,其中E表示预期值,S表示版本号。当设置某个值时,它不仅检查值是否匹配,还会检查版本号是否也匹配,只有两者都匹配才会执行相应的操作。


十二、Atomic 原子类

原子类说简单点就是具有原子/原子操作特征的类。


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

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

相关文章

STM32F4 STD标准库串口接收中断+空闲中断例程

STM32F4 STD标准库串口接收中断空闲中断例程 🔖工程基于STM32F446 ✨用惯了STM32CubeMX傻瓜式配置,突然改用标准库写代码,初始化外设内容,总是丢三落四的。 📗串口初始化配置 void uart_init(uint32_t bound) {//GPIO…

Web渗透信息收集进阶

网站敏感目录与文件 网站敏感目录表示网站目录中容易被恶意人员利用的一些目录。通常恶意人员都是通过工具扫描,来扫出网站的敏感目录,敏感目录是能够得到其他网页的信息,从而找到后台管理页面,尝试进入后台等,扫描网…

告别盲目决策!精益生产KPI指标管理系统让你的企业更聪明

在当今快速变化的商业环境中,企业为了保持竞争力,需要高效地追踪、分析和优化各种业务指标。为了实现这一目标,越来越多的企业开始引入指标管理系统,这一工具在提升管理效率和促进业务增长方面发挥着至关重要的作用。 一、什么是…

图解Linux内核(基于6.x):解读Linux内存反向映射之匿名映射

文章目录 📑前言一、匿名映射的mapping二、推荐阅读2.1 一图速览2.2 内容简介 📑前言 内存映射中,我们经常讨论的是由虚拟内存定位物理内存(也就是folio或者page),实际上在很多场景中(比如内存回…

MATLAB直方图中bin中心与bin边界之间的转换

要将 bin 中心转换为 bin 边界,请计算 centers 中各连续值之间的中点。 d diff(centers)/2; edges [centers(1)-d(1), centers(1:end-1)d, centers(end)d(end)];要将 bin 边界转换为bin 中心 bincenters binedges(1:end-1)diff(binedges)/2;

森林之下延迟高如何处理 森林之下联机卡顿的解决方法

森林之下是一款结合了农场模拟、恐怖生存的游戏,玩家需要管理一个被“闹鬼的树林”包围的农场,种植农作物,拯救、驯服、饲养动物,探索被诅咒的森林,并且收集物品来破除诅咒。这款游戏目前已经开放了demo,不…

创新入门 | 病毒循环Viral Loop是什么?为何能实现指数增长

今天,很多高速增长的成功创业公司都在采用”病毒循环“的策略去快速传播、并扩大用户基础。究竟什么是“病毒循环”?初创公司的创始人为何需要重视这个策略?这篇文章中将会一一解答与病毒循环有关的各种问题。 一、什么是病毒循环&#xff08…

【计算机毕业设计】211校园约拍微信小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

增强大型语言模型(LLM)可访问性:深入探究在单块AMD GPU上通过QLoRA微调Llama 2的过程

Enhancing LLM Accessibility: A Deep Dive into QLoRA Through Fine-tuning Llama 2 on a single AMD GPU — ROCm Blogs 基于之前的博客《使用LoRA微调Llama 2》的内容,我们深入研究了一种称为量化低秩调整(QLoRA)的参数高效微调&#xff0…

Python 基础:文件

目录 一、从文件中读取数据1.1 读取整个文件1.2 逐行读取 二、写入文件2.1 写入空文件2.2 写入多行2.3 附加到文件 遇到看不明白的地方,欢迎在评论中留言呐,一起讨论,一起进步! 本文参考:《Python编程:从入…

【植物大战僵尸杂交版】致敬传奇游戏玩家——一个普通人的六年坚持

目录 缘起 波澜 凌云 缘起 曾​​​​​​佳伟是《植物大战僵尸》的忠实粉丝,这款游戏给了他很多乐趣,也成为了他度过困难时期的精神支柱。他决定制作杂交版,部分原因是出于对原版游戏的热爱和致敬。 六年前,出于对一些pvz续作…

[AIGC] MyBatis-Plus中如何使用XML进行CRUD操作?

在MyBatis-Plus中,我们可以非常方便地使用XML进行CRUD(创建、读取、更新、删除)操作。以下是一些基本步骤和示例,希望能帮助到还在初学阶段的您。 文章目录 1. 创建Mapper接口2. 创建Mapper XML 文件3. 调用Mapper方法 1. 创建Ma…

SpringBoot实现的大文件上传

前言 大文件分片上传和断点续传是为了解决在网络传输过程中可能遇到的问题,以提高文件传输的效率和稳定性。 首先,大文件分片上传是将大文件分割成较小的片段进行上传。这样做的好处是可以减少单个文件的传输时间,因为较小的文件片段更容易快…

微博舆情分析系统可以继续完善的基于python 前端vue

微博舆情分析系统可以继续完善的,前后端分离,前端基于vue 后端基于python的flask可以说是非常的简洁,支持实时更新数据。界面如图 主要工作点体现在后端实时更新数据跟数据的处理方面上,后续有空会用hadoop来处理海量数据真…

Clickhouse监控_监控的指标以及Grafana配置Clickhouse指标异常时触发报警

使用PrometheusGrafana来监控Clickhouse服务和性能指标 Clickhouse监控指标的官方文档https://clickhouse.com/docs/zh/operations/monitoring 建议使用PrometheusGrafana组合监控Clickhouse服务和性能指标,数据流向:Prometheus的clickhouse_exporter组件…

文件扫描工具都有哪些?职场大佬都在用的文本提取工具大盘点~

回想起刚毕业初入职场那阵子,领导让帮忙把纸质文件扫描提取为文本时,还只会傻乎乎地一点点操作,属实是费劲得很! 好在后面受朋友安利,找到了4个能够快速实现文件扫描文字提取的方法,这才让我的办公效率蹭蹭…

JUC并发编程第十四章——线程安全集合类

1 并发集合 1.1 线程安全集合分类 a.遗留的线程安全集合 遗留的线程安全集合如 Hashtable , Vector b.使用 Collections 装饰的线程安全集合 使用 Collections 装饰的线程安全集合,如: Collections.synchronizedCollectionCollections.sy…

【FreeRTOS】估算栈的大小

参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》 目录 估算栈的大小回顾简介计算说明估计函数用到的栈有多大合计 估算栈的大小 回顾 上一篇文章链接:http://t.csdnimg.cn/Cc8b4 传送门: 上一篇文章 上一篇文章创建的三个任务 /* 创建任务:声 *…

一个新的剪辑拼接图片和视频类APP在测试阶段需要测试内容,以iPhone APP为例:

1.UI参照原型图和设计稿 如有改动,需及时沟通 2.iPad转屏、不同iPhone和iPad机型测试 3.黑夜白天模式 2.各功能模块流程需要测试跑通 3.订阅支付模块 a. UI设计是否和设计稿一致 b.涉及订阅的位置都要测试 c.免费试用是否显示;试用结束后&#xff0c…

【Gitlab】访问默认PostgreSQL数据库

本地访问PostgreSQL gitlab有可以直接访问内部PostgreSQL的命令 sudo gitlab-rails dbconsole # 或者 sudo gitlab-psql -d gitlabhq_production效果截图 常用SQL # 查看用户状态 select id,name,email,state,last_sign_in_at,updated_at,last_credential_check_at,last_act…