论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
Java面试之多线程&并发篇(9)
Java面试之多线程&并发篇(9)
金歌
金牌会员
|
2024-11-29 17:23:51
|
显示全部楼层
|
阅读模式
楼主
主题
919
|
帖子
919
|
积分
2757
媒介
本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!引用类型有哪些?有什么区别?说说你对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虚拟机会对指令重排做出一些规则限制,并不能让所有的指令都随意的改变执行位置,主要有以下几点:
单线程每个操作,happen-before于该线程中恣意后续操作
volatile写happen-before与后续对这个变量的读
synchronized解锁happen-before后续对这个锁的加锁
final变量的写happen-before于final域对象的读,happen-before后续对final变量的读
传递性规则,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,分别创建程序模型,并通过多线程分别运行这几个任务,那就简单很多了。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
金歌
金牌会员
这个人很懒什么都没写!
楼主热帖
iOS 集成WebRTC相关知识点总结 ...
白鲸开源 DataOps 平台加速数据分析和 ...
SQL Server 2014完全卸载与SQL Server ...
缓存穿透,缓存雪崩,缓存击穿 ...
【docker专栏6】详解docker容器状态转 ...
一个工作薄中快速新建多个数据表 ...
查漏补缺——路由显示的是http://local ...
【ALM工具软件】上海道宁与Perforce为 ...
.NET ORM框架HiSql实战-第一章-集成HiS ...
iOS直播/游戏怎么利用特殊音效制造娱乐 ...
标签云
挺好的
服务器
浏览过的版块
.Net
快速回复
返回顶部
返回列表