开篇闲扯

一年又一年,年年多线程。不论你是什么程序员,都逃脱不了多线程并发的魔爪。因为它从盘古开天辟地的时候就有了,就是在计算机中对现实世界的一种抽象。因此,放轻松别害怕,肝了这系列的多线程文章,差不多能吊打面试官了(可别真动手...)。

并发症

并发问题,曾经在单核单线程的机器上是不存在的(不是不想,是做不到)。假如把计算机看成一个木桶,那么跟我们Java开发人员关系最大的就是CPU、内存、IO设备。这三块木板发展至今,彼此之间也形成了较大的性能差异。CPU的核心数线程数在不断增多,内存的速度却跟不上CPU的步伐,同理IO设备也没能跟上内存的步伐。于是就加缓存,经过科学论证三级缓存最靠谱,于是就有了常见的CPU三级缓存。然后前辈们再对操作系统做各类调度层面的深度优化,通过软硬兼施的手法,使得软件与硬件的完美结合,才有如今繁荣的互联网。而我们不过是在这座城市里的打工人罢了。 言归正传,本文将分别说明在并发世界里的“三宗罪”:可见性、原子性、有序性。

罪状一:可见性

前文中有说到CPU的发展经历了从单核单线程到现在的多核心多线程,而内存的读写性能却供应不上CPU的处理能力,于是就增加了缓存,至于前文中提到的三级缓存为什么是三级,不在本文讨论范围,有兴趣自己看去。。。

为什么会有可见性问题?

在单核心时代,所有的线程都是交给一个CPU串行执行,因此不论有多少线程都是排队执行,也就不会形成线程A与B同时竞争target变量的竞争状态,如图一。

image.png

来到多核心多线程时代,每颗CPU都有各自的缓存,如果多个线程分别在不同的CPU上运行,且需要同时操作同一个数据。而每颗CPU在处理内存中的数据时,会先将目标数据缓存到CPU缓存中。这时候CPU们各干各的,也不管目标值有没有被其他CPU修改过,自己在缓存中修改后不管三七二十一就写回去,这肯定是不行的啊兄弟...,而这就是我们Java中常说的数据可见性问题,再追根溯源就是:CPU级别的缓存一致性协议。后边文章会详细解释(别问具体时间,问了就是明天)。

可见性问题怎么解决?

这个简单,如果仅仅是解决可见性,那就Volatile关键字用起来(也不是万能的,慎重考虑),它会将共享变量数据从线程工作内存刷新到主存中,而这个关键字的实现基础是Java规范的内存模型,注意,这里要和JVM内存模型区分开,两者是不一样的东西。那么Java内存模型又是什么样的,为啥设计这个内存模型,有哪些好处?下篇详细解释!本文就先放一张简单的图:

image

罪状二:原子性

大家都知道CPU的运行时间是分片进行的,可能CPU这段时间在执行我写的if-else,下一时刻由于操作系统的调度当前线程丢失时间片,又执行其他线程任务去了(呸!渣男)。打断了我当前线程的一个或者多个操作流程,这就是原子性被破坏了,也就是多线程无锁情况下的ABA问题。跟我们期望的完全不一样啊,还是看图说话:

image

解释一下就是:想要得到temp为2的结果,但是只能得到1,原因就是运行A线程的CPU干别的去了,而这时候B线程所在的CPU后发制A,抢先完成了++的操作并写回内存,但是A不知道,还傻傻的以为它的到的是temp的初恋,又傻傻的写会去,然后就心态崩了呀!偷袭~(出错)

罪状三:有序性

如果说原子性问题是硬件工程师挖的坑(CPU别切换多好),那有序性就妥妥的是软件工程师下了老鼠夹子(夸张了啊,其实都是为了效率)。之所以存在有序性问题,完全是编译大神们对我们的关爱,知道我们普通Coder对性能的要求是能跑就行。

因此,在Java代码在编译时期动了手脚,比如说:锁消除、锁粗化(需要进行逃逸性分析等技术手段)或者是将A、B两段操作互换顺序。但是,所有的这一切都不能影响源码在单线程执行情况下的最终结果,即as-if-serial语义。这是个很顶层的协议,不论是编译器、运行时状态还是处理器都必须遵守该语义。这是保证程序正确性的大前提。当然,编译器不仅仅要准守as-if-serial语义,还要准守以下八大规则--Happens-Before规则(八仙过海各显神通):

什么是Happens-Before规则?

一段程序中,前面运行后的结果,对后面的操作来说均可见。即:不论怎么编译优化(编译优化的文章以后会写,关注我,全免费)都不能违背这一指导思想。不能忘本

image

注:文章里所有类似“先于”、“早于”等词并不严谨不能和Happens-Before划等号,只是这样说更好理解,较为准确的含义是:操作结果对后者可见。

其实,总结来说就是JMM、编译器和程序员之间的关系。

JMM对程序员说:你按顺序写,执行结果就是按照你写的顺序执行的,有BUG就是你自己的问题。
程序员:好的,听你的!
JMM对编译器说:你不能随便改变程序员的代码顺序,我都跟他承诺写啥是啥了,别搞错了。
编译器:收到!(可我还是想优化,我不影响你不就行了,这优化我做定了,奥利给!)

于是就有了这些规则,而对于我们CRUD Boy来说都是不可见的,了解一下就OK!

感谢各位看官!

作者:罗拉快跑跑跑跑
原文链接:https://www.cnblogs.com/RollerRunning/p/14047049


http://www.taodudu.cc/news/show-3516711.html

相关文章:

  • 2020从干饭人到打工人
  • 干饭了干饭了 适合新手 git命令和流程
  • 干饭@VI编辑器
  • 干饭人是什么梗?
  • 哲学家干饭问题 C++
  • 干饭人
  • goland 激活码
  • 疫情下健康码行程码原理
  • 国内大厂应用在移动端 Flutter 框架使用分析
  • 搭建闲鱼链接
  • 分享一个转转闲鱼交易猫源码
  • 仿淘宝闲鱼的 TabBar
  • 闲鱼平台多卖家出售真人妇科检查视频 回应:已下架
  • 花费2个月写的 基于微信小程序的b2c二手交易、仿闲鱼、仿58可以个人注册发布交易平台 界面欣赏
  • 闲鱼无货源如何做到一天100+出单完整攻略分享!!
  • 闲鱼Flutter图片框架架构演进(超详细)
  • 闲鱼如何破解「微信咨询、闲鱼担保支付」的尴尬境地?
  • 使用frida发送微信消息给好友
  • 微信小程序仿闲鱼『下拉菜单』
  • 闲鱼自动化脚本上架下架翻新效果!!!
  • 闲鱼引流怎么留微信,这些方法让你轻松搞定!
  • 206_QT_功能实现代码、界面控件操作代码分开实现,很不错【采用了Q_CLASSINFO、Q_PROPERTY、setProperty对控件设置属性、qobject_cast】
  • python 实现跳一跳自动化代码_Guoq
  • Windows文件直接上传到Linux
  • 在ubuntu8.04上配置samba
  • java web网站实例_Java Web开发: 基于HttpServlet的用户登录网站 实例
  • expect 编译安装
  • java pdf生成图片水印 itext
  • apache服务,或者说httpd服务,如何启动,如何开机启动
  • apache服务,或者说httpd服务,如何启动,如何开机启动。

干饭人干饭魂,年轻人干了这碗多线程,就是人上人!相关推荐

  1. 人在职场,干得好真的不如汇报得好?

    写在前面 新的一年,我们想和大家聊点 flag,比如升职加薪. 上学的时候,总觉得升职加薪的逻辑很直白:工作做好了,经验够多了,能力和资历都到了,自然就升职加薪了.工作以后才发现,职场上还有别的说法. ...

  2. **打工人打工魂,争取外贸人上人**

    打工人打工魂,争取外贸人上人 做外贸如何找到精准客户 在外贸人寻找客户的路上,所需要做的内容还有很多很多.老客户人里将会成为外贸人群里重要的客户群体之一.这些参展商往往都是行业的批发商.进口商或者是制 ...

  3. 年轻人疯狂追捧“临期食品”,餐饮人却担心“灰色地带”被暴露

    谁能想到,吃临期食品成了年轻人的新时尚. 来 源 | 餐企老板内参(ID:cylbnc) 作 者 | 王菁 01 年轻人都爱的"临期食品", 餐饮人爱不爱? 一盒小龙坎自热火锅,天 ...

  4. 干了这碗鸡汤:从理发店小弟到阿里P10技术大牛

    1.引言 MIT TR 35(MIT Technology Review 35 Innovators Under 35)--"全球 35 位 35 岁以下科技创新青年"榜单,是全球 ...

  5. 张一鸣:和优秀的人做有挑战的事,比管多少人、多高的title更重要

    这是张一鸣多年前的一篇文章,彼时的头条还是个小公司,还在为招募人才发愁.这篇文章对互联网产品技术人才如何选择公司,提出了很好的建议. 最近有点郁闷,又有候选人把我拒绝了. 其实拒和被拒经常发生,并不都 ...

  6. 职场人加班洞察报告:超7成职场人“被迫加班”,你中枪了吗?

    一入职场深似海,似乎每个职场人都逃不掉"加班"这件事儿.近日,智联招聘发布的<职场人加班洞察报告>显示,只要加班费合理,多数职场人是愿意加个班的.可是除了加班费, 有多 ...

  7. 家境不好的人会在哪些方面输给家境好的人?

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Callan Xu 链接:https://www.zhihu.com/question/28145825/answer/8 ...

  8. 直播间越播越没人,大部分刚开始做直播电商的人都会这样

    直播间越播越没人,大部分刚开始做直播电商的人都会这样,看着其他同行的直播间做得不错就照葫芦画瓢,并不知道背后做了哪些工作? 开播前一定要准备直播脚本和产品过款话术,不要让直播在直播间随意发挥,团队也随 ...

  9. 云顶之弈怎么防止被机器人拉_云顶之奕机器人勾人规律和原理-云顶之奕机器人勾人技巧讲解...

    云顶之奕机器人勾人规律和原理-云顶之奕机器人勾人技巧讲解 2019-08-08 作者:佚名  来源:本站整理  评论:0 lol云顶之奕游戏中新增加一个机器人角色,它有一个长勾子可以把敌人给勾到自己家 ...

最新文章

  1. activity的四种加载模式
  2. Linux修改hostname(临时或者永久)
  3. Codeforces 432D Prefixes and Suffixes (KMP、后缀数组)
  4. Vitaly and Night
  5. android 字体渲染机制,Android:字体渲染问题.ttf 3MB
  6. 申万一级行业日指数_基金收评 | 指数震荡走弱,军工股成两市主线!后期行情如何?...
  7. 从高中生活步入大学生活
  8. OpenCVQt学习之一——打开图片文件并显示
  9. Json文件转Map(四)之代码
  10. 7. Linux 环境
  11. 将url编码数据转换为简单字符串
  12. 《天道》中最智慧的4句话,看懂改变一生
  13. 偷得浮生半日闲--php入门
  14. 岩板铺地好吗_卧室铺地板还是瓷砖好 这里给你答案
  15. Java泛型中的桥方法(Bridge Method)
  16. 零基础如何入门编程开发?
  17. “牛市”惊涛骇浪中的股友们
  18. 100G的文件如何读取续集 - 第307篇
  19. iOS14-桌面小插件 StaticConfiguration
  20. 优秀网页设计:使用纹理的20个华丽示例

热门文章

  1. Qt5获取windows系统下除去任务栏后的屏幕高度
  2. 【Android珍藏】推荐10个炫酷的开源库
  3. 打印机无法打印解决方法
  4. 今天我们来谈谈【像素流送】到底是什么?!
  5. 基于瑞芯微RK3399Pro+RK1608,盎锐科技发布一体化3D智能视觉开发平台
  6. 网络安全kali之利用宏感染word文档获取shell
  7. Python分析国家领导人新春贺词建立主题模型
  8. 最新kali之sqsh
  9. 百度竞价搜索推广出价策略
  10. PMP项目管理项目采购管理