本文节选自《On Java 中文版 进阶卷》

第5章 并发编程

ON JAVA

并发的超能力

想象你是一部科幻电影中的角色。有一栋拥有1000万个房间的高楼,你的目标巧妙地藏身于其中一个房间,而你需要找到它。你进入大楼,沿着走廊往里走,走廊尽头是岔路口。

如果仅靠你一个人,你得花100辈子才能完成这个任务。

这时假设你拥有一种超能力,可以克隆一个自己的分身,然后让分身沿着岔路继续走下去,你自己则继续往前走。每次遇到岔路或者上楼的楼梯,你就重复克隆的操作。最终整个大楼的每一条走廊尽头都会有你的一个分身。

每条走廊有1000个房间,你的超能力不太够,同时最多只能克隆出50个自己。

一旦一个分身进入一个房间,他需要寻遍每一个角落。这时他启动了第二个超能力,将自己分裂成100万个纳米机器人,每个机器人都飞入或爬入某个隐蔽的角落。你不用明白这是怎么一回事儿,只要知道可以这么干就行。这些纳米机器人自行搜寻房间,完成之后就重新组装成你的分身。你忽然间就知道目标是否在这个房间里了。

我很想说:“科幻电影里的超能力?那不就是并发嘛!”每来一个新任务,就克隆一个分身,就这么简单。但问题是不论我们用哪种模型来描述这个奇迹,最终都会陷入抽象泄露的困境中。

ON JAVA

抽象泄露的困境

其中一种泄露是这样的:在理想世界中,每次克隆你都需要复制一套硬件处理器来运行新的分身。但这显然不可能做到,实际上你的机器只会有4个或8个处理器(常见情况)。你可能有更多的处理器,但在很多情况下也很可能只有1个。在抽象的相关探讨中,物理处理器的分配方式不仅会被泄露,而且甚至还能左右你的决策。

我们再来修改一下电影设定。现在,当每个分身到达一个房间门口时,他都需要敲门,并且等待开门。如果每个分身都能分配一个处理器,那就不会有什么问题。处理器挂起等待就行,直到有人开门。但是,如果只有8个处理器,却有成千上万个分身,我们并不希望处理器被闲置,仅仅因为一个分身等待开门,并由此导致阻塞。我们希望能将处理器分配给当前能干活的分身,所以需要一套将处理器在任务间切换分配的机制。

很多模型可以将处理器的实际数量对外屏蔽,并允许你伪装成有很多处理器的样子。但在某些场合下,该机制可能失效,这时就必须清楚地知道处理器的实际数量,由此才能围绕实际数量做出更优决策。

ON JAVA

一个关键的决定因素

一个关键的决定因素是处理器是否多于一个。如果只有一个处理器,那么它要承受额外的任务切换带来的性能损耗,这时并发反而会使系统变得更慢。

假设有一个负责电话应答的客服部门,客服团队人数有限,但是可能会有很多电话打进来,客服人员(相当于处理器)必须在一部电话上完成整个通话才能挂断,其他打进的电话则必须等待。

在童话故事《鞋匠和精灵》里,鞋匠要做的鞋太多了,当他睡觉时,一群精灵会来帮他做鞋,此时就变成了分布式处理。但即使有很多物理处理器(精灵),性能还是会在某些部件生产上遇到瓶颈,比如做鞋底需要的时间最长,那么这个环节就会限制鞋的整体生产速度,相应地也会迫使你优化解决方案。

因此,不同的问题会促成不同的方案设计。理想很美好,我们可以把任务分解成很多子任务并让它们“各自独立运行”,但现实则往往是另一回事,物理现实会不断打击美好的理想。

ON JAVA

麻烦不止这些

麻烦还不止这些。假设有个生产蛋糕的工厂,我们已经在某种程度上实现了将蛋糕生产的任务按人拆分,但问题还是来了。工人A即将执行将蛋糕放入包装盒的步骤,盒子也已经就绪,结果当工人A开始放入蛋糕的操作时,工人B抢先一步将另一个蛋糕放进去了,而工人A并未停止手头的动作,结果“吧唧”一下,两个蛋糕碰到了一起,形状也都破坏了。这就是导致常见的竞态条件(race condition)的“共享内存”问题,其结果取决于哪位工人会先将他的蛋糕放入盒子(典型的解决方案是使用锁机制,总有一位工人能先锁定盒子,从而避免别人的蛋糕放入)。

这种问题通常发生于同时执行的任务互相干扰时,而且常常表现得复杂微妙、难以预测,因此可以说并发是“理论上充满确定性,实际上充满不确定性”。意思是说,你总是感觉你的并发程序经过了周全的考虑,代码检测没问题,运行也正确。但现实中更常见的情况是,写出来的并发程序只是看起来运行正常,但是在某些条件下会出问题。这些条件可能永远不会真的形成,或者形成的概率低到在测试过程中根本不会发现。实际上,一般不太可能为并发程序编写生成失败条件的测试用例,这些错误通常又非常偶发,因此最终只会默默转化为客户的抱怨。

这就是学习并发最有说服力的理由之一:一旦忽略,便可能遭到反噬。

并发因此显得充满危险,而如果你因而心生畏惧,那这很大程度上是件好事。虽然Java 8在并发上做了很大的改进,但仍旧未提供诸如编译时校验异常检查那样可以明确告知错误的安全防范手段。在并发层面上,你只能靠你自己。只有抱着求知若渴、敢于质疑和积极向上的态度,你才能编写出可靠的Java并发程序。

点击 “阅读原文” 进行试读

科幻电影里的超能力?那不就是并发嘛!相关推荐

  1. AI未来是什么样子,这些科幻电影里已经有了答案

    摘要: 科幻电影正是科学幻想的产物,那些难忘的影像与经典的瞬间中,"深邃的思想和丰饶的想象神奇地交相辉映." 在科技前行的漫长历史河流中,科学幻想始终以其丰富的想象力.深邃的洞察力 ...

  2. 科幻电影里的机器人假肢已经照进现实

    来源:机器人大讲堂 编辑:Jack 排版:麦子 20日晚,在卡塔尔世界杯开幕式上,一个身有严重残疾,胸部以下几乎缺失的卡塔尔人一亮相就赢得全场欢呼.一直以来,人们对坚强不屈的肢体残障人士都深怀敬意,而 ...

  3. 哪些科幻电影里有计算机知识的常识性错误,盘点科幻电影中最常见的常识性科学错误,原来你被骗了!...

    原标题:盘点科幻电影中最常见的常识性科学错误,原来你被骗了! 科幻电影里让人眼花缭乱的高科技总是让人叹为观止,但是我们在欣赏这些科技特效的同时需要知道,里面的很多东西都犯了常识性的科学错误.下面图帮主 ...

  4. 这款从科幻电影里开出来的车,让堵车也变成享受

    硅谷Live / 实地探访 / 热点探秘 / 深度探讨 小探看科幻片时,经常对着里面的炫酷座驾流口水.科幻片不同,梦幻座驾却都是那么炫酷... <少数派报告>里,汤姆克鲁斯那辆能声控.能自 ...

  5. 克隆人不只出现在科幻电影里?阿里虚拟美女“俪知”亮相

    一个多小时,就能用AI技术克隆出一个你,是不是难以想象? 阿里巴巴研发的一项黑科技,通过学习你的视频,就能瞬间克隆出一个"数字化的你".电影<银翼杀手>里的" ...

  6. CES智能硬件新品TOP 10:科幻电影穿越到现实

    固然智能硬件永世只可被当做配件来对于,但每届CES展会上,反而是这些不起眼的小货品让人当前一亮.你可别忽视它们,比拟家里的电器三大件或者每天带领的手机,智能硬件更或许轻浅变革你我的生涯. 说回到这届C ...

  7. 星际旅行、返老还童…1.3万字看完今年的WE大会,简直就是一部科幻电影

    来源:腾讯科技 概要:在第五届WE大会上,科学家们的"脑洞"更大了:星际旅行.返老还童等一个个过去科幻电影里的镜头出现了. 11月5日,WE大会在老时间.老地点如约而至. 时光飞速 ...

  8. 重装上阵超萌机器人_盘点那些在电影里超萌又超能力的机器人

    原标题:盘点那些在电影里超萌又超能力的机器人 最近可是被<超能陆战队>里的大白萌翻了,虽然它是个充气机器人,但是能力却丝毫不逊色.当然他主要还是属治愈系机器人,陪你玩,给你靠.就想想在我们 ...

  9. 五部超燃科幻电影,九成没有全部看过

    https://www.ixigua.com/7087745709490995726https://www.ixigua.com/7087745709490995726五部超燃科幻电影,全部看过,你就 ...

最新文章

  1. Docker构建Nginx+Tomcat动静分离架构
  2. 数学是什么?_题跋—数学是什么?
  3. class_create
  4. php接收键盘事件,js获取键盘事件的方法实例
  5. 沟通模型包含5个状态
  6. 常用的7个SQl优化技巧
  7. mastercam加工报表生成_2020北京加工中心编程培训工厂教学行业
  8. Github如何更新Fork的仓库
  9. linux驱动编写(pwm驱动)
  10. php字符串和数组基本方法,PHP字符串和数组
  11. 以汉字开头,以某个词结尾的一段文字的正则
  12. Quartz数据库存储
  13. Python简单方法实现英文文本词频统计
  14. 域名已注册好,如何做网站?
  15. emplace_back不能取代push_back的情况
  16. 年龄、工龄、计算(精确到天)
  17. 用Excel完成专业化数据统计、分析工作
  18. 【Codecs系列】双帧参考特性
  19. mipi协议csi和dsi
  20. 解决问题记录4:kettle数据库连接报错时区问题

热门文章

  1. 放大器非线性失真研究装置设计报告_我校信息学院学子再次斩获大学生电子设计竞赛大奖...
  2. python 最快 因式分解_python中怎么对一个数进行因式分解?
  3. android md日期选择器,移动端日期选择
  4. 结构事物 java uml,UML考试试题及答案7讲解
  5. Layui + bootstrap + servlet 的房屋出租管理系统
  6. java中block类6_Java 实现区块链中的区块,BLOCK的实现
  7. 如何让小程序页面更顺滑_微信小程序|实现界面滑动切换
  8. 计算机考研专业课资料百度云,2020年考研专业课【初试】资料清单
  9. 前端面试题整理(定期更新)
  10. 浏览器数据库IndexedDB介绍