版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JMM(Java内存模型)笔试试题及详细答案适用场景:Java后端面试、校招笔试、JVM基础考核一、单项选择题(共8题,每题3分)1.以下关于JMM的核心定义,说法正确的是()A.JMM是JVM的内存分区(堆、栈、方法区)B.JMM是一套多线程共享内存的读写规范,解决可见性、有序性、原子性问题C.JMM只负责volatile关键字的规则D.JMM是操作系统的内存模型答案:B详细解析:很多新手容易把JMM和JVM内存结构搞混。JVM内存结构是堆、栈、本地方法栈这些内存分区;而JMM是多线程内存读写的抽象规范,专门用来解决并发三大问题:原子性、可见性、有序性。2.多线程并发中,可见性问题的根本原因是()A.代码没有加锁B.线程存在工作内存(缓存),不会实时刷新主内存C.CPU多核导致并行执行D.程序出现指令重排答案:B详细解析:JMM规定每个线程有自己的工作内存,变量优先读取缓存,不会每次都读主内存。一个线程改了变量只更新自己工作内存,其他线程看不到,这就是可见性问题。3.以下关键字中,可以保证可见性、禁止重排,但不保证原子性的是()A.synchronizedB.volatileC.finalD.static答案:B详细解析:volatile三大特性:保证可见性、禁止指令重排序、不保证复合操作原子性(比如i++)。synchronized才是三者全部保证。4.指令重排序的目的是()A.为了让代码执行顺序和书写顺序一致B.JVM/CPU为了提升执行效率、优化指令流水线C.为了保证多线程安全D.为了保证变量可见答案:B详细解析:指令重排是编译器、CPU的正常优化手段,单线程下完全没问题,不会影响结果;但多线程下会打乱执行顺序,导致有序性问题。5.以下操作中,volatile无法保证线程安全的是()A.单个变量赋值:flag=trueB.变量自增:count++C.变量读取:if(flag)D.变量直接赋值:num=100答案:B详细解析:count++不是单条指令,是“读取-运算-赋值”三步复合操作。volatile只能保证单次读写可见,无法保证这三步不被多线程穿插执行,所以会出现线程不安全。6.JMM中,happens-before的核心作用是()A.强制代码串行执行B.定义指令执行的先后顺序规则,限制非法重排序C.保证所有变量原子性D.替代锁的功能答案:B详细解析:happens-before是JMM的核心规则表,只要满足规则,就说明前面的操作对后面可见、禁止重排;不满足的,JVM就可以随意重排优化。7.关于synchronized和volatile对比,说法错误的是()A.synchronized保证原子性、可见性、有序性B.volatile无锁、效率更高C.synchronized会阻塞线程D.volatile可以替代锁解决计数问题答案:D详细解析:volatile不能解决复合操作并发问题,绝对不能替代锁做计数、累加、更新运算。8.单线程环境下,JMM的重排序优化()A.一定会导致程序出错B.不会影响最终执行结果C.会造成变量不可见D.会禁止代码优化答案:B详细解析:重排序优化的设计原则就是:单线程结果绝对不变,只在多线程共享变量场景才会出问题。二、填空题(共4空,每空2分)1.并发编程三大特性:原子性、_________、_________。答案:可见性、有序性2.JMM将内存分为两部分:_________和线程工作内存。答案:主内存3.volatile关键字通过_________禁止指令重排序。答案:内存屏障4.happens-before规则中,解锁操作一定_________后续的加锁操作。答案:先于三、简答题(共4题,分值各10分)1.简单说清楚:到底什么是JMM?(面试标准版答案)标准答案:JMM全称Java内存模型,是Java为了屏蔽不同操作系统、CPU内存差异,定义的一套多线程共享变量的内存访问规范。它不约束内存分区,只约束多线程读写规则,核心目的就是解决并发的三个问题:1.原子性:操作不可被拆分2.可见性:一个线程修改,其他线程及时看见3.有序性:避免不合理的指令重排2.为什么volatile不能保证i++线程安全?标准答案:i++本质是三步操作:1.从主内存读取i的值2.寄存器执行+1运算3.写回主内存volatile只能保证单次读写可见、禁止重排,但无法保证这三步整体不被打断。多线程下多个线程同时读取旧值、同时计算、同时写回,就会出现覆盖丢失,最终计数偏小。3.说一下volatile的使用场景标准答案:volatile适合状态标记、只读、单次赋值场景,不适合计算更新场景。常见场景:1.线程终止标记位(booleanflag)2.双重检查锁(DCL)单例模式3.配置实时刷新、开关变量更新4.讲一下你理解的happens-before核心标准答案:happens-before是JMM判断是否允许指令重排的规则:如果操作Ahappens-before操作B,那么:1.A的结果对B可见2.JVM不能对A、B做非法重排序常见几条高频规则:1.单线程:前面代码happens-before后面代码2.锁解锁:解锁happens-before后续加锁3.volatile:写操作happens-before读操作4.线程启动:start()先于线程内所有操作四、辨析题(面试高频压轴20分)题目:请解释DCL单例为什么必须加volatile?不加会出现什么问题?详细答案:DCL即双重检查锁单例,不加volatile会因为指令重排序导致空指针、拿到半初始化对象。对象创建正常顺序:1.分配内存空间2.初始化对象属性3.将对象引用赋值给变量JVM优化重排后可能变成:1-3-2也就是:先分配内存、先赋值引用,再初始化对象。多线程下,线程A执行到赋值、还没初始化完成;线程B判断变量不为null,直接返回未初始化完成的半残对象,使用时报错。volatile作用:禁止对象创建过程的指令重排,保证初始化完成再赋值,彻底解决DCL线程不安全问题。试卷总结考点(背诵版)1.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年重庆市政府采购评审专家考试试题及答案
- 2025年注册安全工程师考试真题及答案
- 2025年注册咨询继续教育试卷及答案
- 2025消防安全考试题集与答案
- 2025年智慧文旅安装系统解决方案
- 2026年2026年安全生产月安全知识竞赛题库(含答案)
- 2026年《医疗器械不良事件监测和再评价管理办法》培训试卷及答案
- 高中数学教资面试函数专项题库及解析 2026下半年
- 亲属活体肝移植治疗儿童Caroli病1例
- 2026年危急值闭环管理督查护理质控教育课件
- 军用关键软硬件自主可控产品名录(2025年V1 完整版)
- 2026年高考广西卷生物高考真题(含解析)
- 2026道德与法治八年级上册教学课件:4.2《遵守规则》
- 2026秋新教材人教版九年级上册数学第二十九章《圆》教案
- 农田灌溉排水渠系工程监理实施细则
- 2026年学法减分考核题库及答案
- 2026年宁夏吴忠社区工作者考试卷附答案
- 2026年西藏从乡村振兴等专干中招录公务员(事业编)(申论)全真模拟试题及答案
- 徐工25吨吊车使用说明书
- 帕金森病深部脑刺激(DBS)手术
- ISO9000-2026 质量管理基础与术语(英文版)
评论
0/150
提交评论