下一章 上一章 目录 设置
18、代课 ...
-
寒假很快过去,景谅又坐着火车回到了学校。
推开宿舍门,景谅发现陈喆居然是第一个到的。他的座位旁边堆着大包小包,吃的、用的、穿的,都有。
“我妈自己做的红薯干,尝尝?”陈喆把一个纸包丢给景谅。他嘴里还塞着东西,说话有些含糊不清。
景谅抬手接住,慈祥地看着他:“儿子长大了,懂得孝敬爸爸了。”
“滚犊子。”陈喆在看手机,连骂人都没抬头。
“看什么呢,这么入迷?”景谅把东西放好,见陈喆还在打字,有些好奇了。
“你没看级群?”
“没啊,大群我都设置的免打扰。”
陈喆无语了:“你牛逼,赶快去看看吧,重大消息!”
于是景谅掏出手机,刚点进他们专业的年级群,就被弹出来的999+给闪瞎了眼。
「听说这学期有个新老师代上1班的选修课,人长的巨帅,而且还多金。」
「呵呵,那可不吗。人家可是幻方熵变集团的安少爷啊!也不知道安少为啥突然来给大学生上课,1班真的是好福气啊!」
「纯路人,这个安少爷很厉害吗?」
「自己去搜啊,新科技业界龙头,你居然没听说过?」
几分钟后,那个“纯路人”又发了一条消息:
「是我有眼不识泰山了,这简直就是传奇人物啊!咱们闫大也是好起来了,居然能请安少来代课!」
「啊啊啊,姐妹们,我刚才看到安少进教学楼了!!好帅好帅!!」
「〔图片〕」
「1班的同学我嫉妒你们……能不能让我也去旁听。」
“诶牢景,你和刘广平不都是1班的吗?”陈喆忽然想起来了:“恭喜啊恭喜,成功脱离API的魔爪。”
“API”是景谅他们原先专业老师的外号,因为说英文,尤其是“API”这三个字母时带着浓重的口音,所以得此外号。
景谅不语,只是皱起眉。
……总感觉像个圈套。
“系统,这安宥之想干嘛?”
系统迟疑道:【“呃,可能是使命感突然爆发了,想浇灌一下祖国的花朵?”】
景谅在心里翻了个大大的白眼:“你信他有使命感,还是信我是秦始皇?”
【“那,那还是信你是秦始皇吧。”】
……
下午一点五十分,景谅准时走进了1班的阶梯教室 。
他终于知道安宥之为什么突然心血来潮,要带大学生上课了。
景谅习惯早十分钟进教室,尽量挑个好位子。平常这个时间教室里人并不多,但今天却人满为患。大家都在明里暗里地观察着讲台上的两人。
安宥之已经提前坐在了讲台区域,正舒舒服服地靠着转椅转圈。
他脸上带着漫不经心的笑意,电脑还没开机,手边只放着一本《软件工程实践与课程设计》。
而在他身边,一直盯着前门口的鹿柟看见景谅的身影,皮笑肉不笑地扯了扯嘴角。
景谅目光上移,与他对视了一眼。
他波澜不惊地走到自己常坐的位置上坐下。
妈的,冲他来的。
……
“……那么,情况就是这样,这学期由我来带你们的专业课。”
安宥之声音懒洋洋的,说着说着还打了个哈欠,一点老师样都没有:“我就不自我介绍了,你们应该都认识,不认识的现在上网查。”
“我旁边这位是我的……助教。”他说完,自己都有点绷不住,只能咳嗽一声忍住笑意:“你们只管当他不存在,看我就行。”
鹿柟闻言凉凉地看了他一眼,然后继续事不关己地翘腿坐着,直直地盯着景谅。
底下一直有学生窃窃私语,兴奋地议论着这位新来的年轻“老师”,更有甚者直接掏出手机拍照,因为忘关闪光灯被身边的人制止后才作罢。
安宥之抬手敲了敲投影幕布,全场立刻安静下来。他托着下巴开口道:“听说上学期郭教授已经上完多线程编程了?很好,现在我来找一位同学现场展示一下上学期的学习成果。”
他装模作样地翻了两下花名册:“——那么,这位叫景谅的同学?”
景谅站起身,整个教室的目光都汇集到了他身上。
他一步步向讲台走去,最后站定在安宥之身边。
安宥之笑眯眯地看着他,伸手点了点自己的电脑:“这是一个典型的线程不安全计数器。景同学,请你为我们现场演示一下,当10个线程各调用1000次increment()后,结果会是多少?并解释原因。”
景谅快速浏览了代码。他心知肚明,正确答案是“结果不确定,但肯定小于10000”。
但他也瞬间看穿,安宥之想让他老老实实地写测试代码,然后得到一个错误结果,再磕磕绊绊地解释原理,从而完成一次“当众出丑”。
景谅没有立刻动手,而是转向安宥之,语气恭敬:
“安老师,直接运行得到错误结果,只能证明它有问题,但无法根治问题。与其演示它‘为什么错’,不如我直接为大家展示‘如何让它对’,并且尝试分析几种主流方案的优劣,您看可以吗?”
安宥之眼底的戏谑消减了几分。
“可以。”他站起身,“贴心”地给景谅让出了自己的座位。
景谅坐在安宥之刚刚坐过的,还有些温热的转椅上。那股安宥之身上奇异的玫瑰花香又出现了,紧紧包裹着他。
景谅感到胸口有点发闷。
鹿柟坐在离他两米开外的地方,一直注视着他。
景谅没有像其他人预想的那样,写一个冗长的多线程测试。他只用了几行代码,就构造了一个极有可能触发问题的场景。
代码运行后,一行字出现在投屏上:
结果输出:预期结果: 10000, 实际结果: 7231。
台下传来一阵恍然大悟的唏嘘。安宥之眯起了眼睛:“嗯,现象看到了。那么,请你修复它吧。”
出乎意料的,景谅并没有修改原始的Counter类,而是对着全班,开始了他的“小讲座”:
“同学们,修复并发问题,需要对症下药。安老师这个案例,病因是count++的非原子性操作。解决方案至少有三种,各有优劣。”
他快速敲击着键盘:
“第一种,同步锁方案。这是最经典的方案,像只有一个洗手间,大家必须排队。可靠,但在高并发下,性能瓶颈明显。”
“第二种,原子变量方案。这是更现代的方案,利用CPU的CAS指令。像大家同时去抢,但只有一个能成功,其他人失败后重试。在高竞争环境下,性能通常优于synchronized。”
最后,他抛出了第三个方案:“其实,最高效的并发,就是没有共享。如果我们使用ThreadLocal,让每个线程操作自己的计数器,最后再汇总,就可以完全避免竞争。”
他展示了使用ThreadLocal的代码草图,虽然在此场景下汇总稍显复杂,但其思想还是让不少认真听课的同学眼前一亮。
景谅同时运行了修复后的三个版本,结果全部正确输出10000。并附上了一句总结:
“所以,选择哪种方案,取决于我们的具体场景:是追求开发速度,是追求极致性能,亦或者是数据特性允许我们做架构上的规避。
“感谢安老师提供的这个经典案例,让我们能一次性横向对比这么多解决方案。”
说完,景谅站起身,向安宥之微微鞠了一躬,接着头也不回地走下台,回到了自己的座位。
教室里安静了几秒,随后响起了热烈的掌声。
刘广平在前排偷偷回头,对他竖起大拇指,景谅只微笑着回应。
安宥之沉默地走到电脑旁,低头看着屏幕。几秒钟后,他抬起头,目光深沉地看向景谅。
两人的视线在空中相撞,像是一场无声的交锋。