Java面试之多线程并发篇(9)

news/2024/11/29 18:22:07/文章来源:https://www.cnblogs.com/xswz/p/18577326

前言

本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!引用类型有哪些?有什么区别?说说你对JMM内存模型的理解?为什么需要JMM?多线程有什么用?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘

*** 12万字的java面试题整理 ***
*** java核心面试知识整理 ***
*** Java高频面试讲解视频(知识涵盖齐全) ***

说说你对JMM内存模型的理解?为什么需要JMM?

随着CPU和内存的发展速度差异的问题,导致CPU的速度远快于内存,所以现在的CPU加入了高速缓存,高速缓存一般可以分为L1、L2、L3三级缓存。基于上面的例子我们知道了这导致了缓存一致性的问题,所以加入了缓存一致性协议,同时导致了内存可见性的问题,而编译器和CPU的重排序导致了原子性和有序性的问题,JMM内存模型正是对多线程操作下的一系列规范约束,因为不可能让陈雇员的代码去兼容所有的CPU,通过JMM我们才屏蔽了不同硬件和操作系统内存的访问差异,这样保证了Java程序在不同的平台下达到一致的内存访问效果,同时也是保证在高效并发的时候程序能够正确执行。

  • 原子性:Java内存模型通过read、load、assign、use、store、write来保证原子性操作,此外还有lock和unlock,直接对应着synchronized关键字的monitorenter和monitorexit字节码指令。
  • 可见性:可见性的问题在上面的回答已经说过,Java保证可见性可以认为通过volatile、synchronized、final来实现。
  • 有序性:由于处理器和编译器的重排序导致的有序性问题,Java通过volatile、synchronized来保证。

happen-before规则

虽然指令重排提高了并发的性能,但是Java虚拟机会对指令重排做出一些规则限制,并不能让所有的指令都随意的改变执行位置,主要有以下几点:

  1. 单线程每个操作,happen-before于该线程中任意后续操作
  2. volatile写happen-before与后续对这个变量的读
  3. synchronized解锁happen-before后续对这个锁的加锁
  4. final变量的写happen-before于final域对象的读,happen-before后续对final变量的读
  5. 传递性规则,A先于B,B先于C,那么A一定先于C发生

说了半天,到底工作内存和主内存是什么?

主内存可以认为就是物理内存,Java内存模型中实际就是虚拟机内存的一部分。而工作内存就是CPU缓存,他有可能是寄存器也有可能是L1\L2\L3缓存,都是有可能的。

多线程有什么用?

一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法:
(1)发挥多核CPU的优势
随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。
(2)防止阻塞
从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单核CPU我们还是要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。
(3)便于建模
这是另外一个没有这么明显的优点了。假设有一个大的任务A,单线程编程,那么就要考虑很多,建立整个程序模型比较麻烦。但是如果把这个大的任务A分解成几个小任务,任务B、任务C、任务D,分别建立程序模型,并通过多线程分别运行这几个任务,那就简单很多了。

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

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

相关文章

记录---前端如何优雅通知用户刷新页面?

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣前言 老板:新的需求不是上线了嘛,怎么用户看到的还是老的页面呀 窝囊废:让用户刷新一下页面,或者清一下缓存 老板:那我得告诉用户,刷新一下页面,或者清一下缓存,才能看到新的页面呀,感觉用户体验不好啊,不能直接…

一文多发小工具

一个一文多发的发布小工具 一个一文多发的发布小工具,作为练手的项目。 概述: 如果有将文章分享到多个平台的需求,可以借助程序来简化这一过程,节省时间并提高效率。 实现思路: 大多数平台支持markdown格式的文本内容,将.md文件作为入口文件读取,发布到各个平台;由于ma…

为 TVM 添加对 Paddle 量化模型的支持

1 简介 随着深度学习应用的广泛使用,量化模型作为一种有效的模型压缩技术,能够在保持模型精度的同时减少模型的计算和存储开销。本文将介绍如何在 TVM 上为 Paddle 深度学习框架中的量化模型提供解析支持。 2 量化方法 目前主流的的量化方法主要分为 QOperator 和 QDQ(Quanti…

tp6 url 规则

http://tp.cc/index.php/index/test return view( index, [info => $info, sj=>$sj] );

拥抱 OpenTelemetry:阿里云 Java Agent 演进实践

我们用了接近一年的时间完成了基于 OTel Java Agent 的升级重构,并于今年 5 月份发布了 4.x 探针的第一个版本 4.1.0,经过接近半年时间的验证、回归、优化,目前最新的稳定版本 4.1.12[11]已经正式发布,欢迎大家了解使用。作者:陈承 背景 在 2018 年的 2 月,ARMS Java Age…

BIM技术:数字孪生城区建设的加速器

在智慧城市建设的浪潮中,BIM(建筑信息模型)技术以其独特的优势,成为推动数字孪生城区建设的重要技术力量。本文将探讨BIM技术如何成为数字孪生城区建设的加速器,以及其在建设过程中的关键作用。BIM技术与数字孪生城区的融合数字孪生城区是指在数字空间构建一个与实体城市相…

ADF - [01] 概述

题记部分 001 || 简介Azure Data Factory (ADF) 是微软 Azure 云平台提供的一种数据集成服务,它允许用户创建、安排和管理数据管道,以实现从不同来源抽取数据、转换数据并加载到目标存储的过程。这个过程通常被称为 ETL(Extract, Transform, Load)。002 || 适用场景 【1】…

使用Powershell运行脚本报错的处理方法

最近在一台办公电脑上运行powershell脚本时报错如下: 系统上禁止运行脚本。有关详细信息,请参阅 https :/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 + .\CreateFolders.ps1 + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : S…

20222408 2021-2022-2 《网络与系统攻防技术》实验七实验报告

1.实验内容 1.1实验内容简述 (1)应用SET工具建立冒名网站。 (2)利用ettercap完成DNS欺骗攻击。 (3)结合应用两种技术,使被攻击者会通过域名访问到冒名网站。 (4)结合攻击过程,提出具体防范方法。 1.2学习内容简述 (1)学习SET工具和ettercap工具的使用。 (2)理解A…

Vulnhub sick0s1.1

0x01:端口扫描 主机发现 nmap -sn 192.168.231.0/24全端口扫描 nmap --min-rate 10000 -p- 192.168.231.14122ssh,3128squid-http,但8080http是关闭的Squid 是一个高性能的开源代理服务器软件,它支持多种协议,包括 HTTP、HTTPS、FTP 等。它通常用于以下几种用途: 1、Web代…

Gemini

Gemini: 大规模DNN芯片阵列加速器的布局和架构 摘要 chiplet概要目标Chiplet(芯片阵列)技术允许在单一加速器上集成不断增加的晶体管的数量,在前摩尔定律时代获得了更高的效果,体现了在快速AI迭代进步中需要的大量算力。 但是,这样也引进了更高昂的大包开销,以及大量的d2…

hhdb数据库介绍(10-19)

监控 智能物理拓扑 物理拓扑图主要以服务器为视角展示集群组件与服务器的所属关系,同时可查看服务器资源的使用情况以及各集群组件服务运行状态。使用前需保证为集群服务器配置了可用的SSH连接信息,否则只能查看当前服务器与集群组件的所属关系,无法查看服务器与组件程序的状…