极客时间已完结课程限时免费阅读

用户来信 | 真好,面试考到这些并发编程,我都答对了!

用户来信 | 真好,面试考到这些并发编程,我都答对了!-极客时间

用户来信 | 真好,面试考到这些并发编程,我都答对了!

你好,我是 Zed,是《Java 并发编程实战》1W+ 订阅者中的一员。
我从事 Java 开发已有五年时间了,曾在一家国内知名物流企业工作,现在杭州一家金融支付类公司继续担任 Java 工程师一职。
大概在今年四月份,在高铁上翻到一篇文章,讲的是“为什么 Object.wait() 方法一定要在 synchronized 内部使用”,因为之前我根本不知道这个问题,所以打算考考我朋友。
结果他给了我一些迥然不同的答案,并邀请我读了宝令老师的《Java 并发编程实战》专栏中的一篇文章《08 | 管程:并发编程的万能钥匙》,看完后我感觉醍醐灌顶,津津有味,果断开始学习。

我是如何通过专栏拿到 Offer 的?

机缘巧合,专栏学习到一半时 ,我辞掉了原有的工作出去面试。因为面试的岗位都是高级工程师,所以基本上离不开并发编程的问题,像锁、线程安全、线程池、并发工具类都是家常便饭
印象比较深刻的是面试官问我:线程池的大小如何确定
那时我刚看完《10 | Java 线程(中):创建多少线程才是合适的?》,然后就胸有成竹且不紧不慢地回答了,面试官听了直点头。
另外一个问题是:怎么理解活锁
于是,我又如法炮制搬出了《07 | 安全性、活跃性以及性能问题》中老师提到“路人甲乙相撞”的例子,同时给出具体的解决方案。
不得不说,这个例子太经典了,这里我必须再展示给大家看!在文章里老师是这样描述活锁的:
所谓的“活锁”,可以类比现实世界里的例子。路人甲从左手边出门,路人乙从右手边进门,两人为了不相撞,互相谦让,路人甲让路走右手边,路人乙也让路走左手边,结果是两人又相撞了。
这种情况,基本上谦让几次就解决了,因为人会交流啊。可是如果这种情况发生在编程世界了,就有可能会一直没完没了地“谦让”下去,成为没有发生阻塞但依然执行不下去的“活锁”。
并且给出了简单有效的解决方案
解决“活锁”的方案很简单:谦让时,尝试等待一个随机的时间就可以了。
例如上面的那个例子,路人甲走左手边发现前面有人,并不是立刻换到右手边,而是等待一个随机的时间后,再换到右手边;同样,路人乙也不是立刻切换路线,也是等待一个随机的时间再切换。由于路人甲和路人乙等待的时间是随机的,所以同时相撞后再次相撞的概率就很低了。
“等待一个随机时间”的方案虽然很简单,却非常有效,Raft 这样知名的分布式一致性算法中也用到了它。
真的很庆幸提前遇到了并发专栏,我的面试顺利通过了。
我可以很负责任地说,如果没有专栏的学习,我不会那么顺利地找到工作。换句话说,专栏其实涵盖了几乎所有大家面试可能会被问到的内容

我是如何进行高效学习的呢?

第一,直接上手跟着敲一遍代码。

我觉得最能表示你在用心学习的方式就是付诸实际行动了,就拿专栏第一模块“并发理论基础”来讲,会涉及到很多的例子,比如:
可见性、原子性等问题的举例说明,直接看《01 | 可见性、原子性和有序性问题:并发编程 Bug 的源头》
用“银行转账模拟”的例子引出死锁问题并如何处理,《05 | 一不小心就死锁了,怎么办?》
如何保证线程安全的同时保证性能,《06 | 用“等待 - 通知”机制优化循环等待》
……
针对这些例子,我能做的就是自己花时间,手动敲一遍代码。要知道,纸上得来终觉浅,绝知此事要躬行!

第二,换位理解。

这也是我觉得最为有效的学习方式之一,站在老师角度,去思考他是如何看这个问题的,他是如何一步步讲解清楚的。而且,宝令老师在每篇文章后面,都会有一段总结,非常有效地来帮助我去获得这篇文章的知识点。提出问题—解决问题—总结得出结论,这关键的三步,在任何地方都适用
所以,我还会花时间思考专栏的“这里”或“那里”跟我之前的理解是否有出入,例如《11 | Java 线程(下):为什么局部变量是线程安全的?》中对局部变量线程安全的解释,跟自己了解的虚拟机执行过程变量共享关系是否吻合?
反复问自己问题的答案是什么,然后和老师的理解做对比,收获感和进步才会是巨大的。

第三,坚持,坚持,再坚持。

学习最难的也是最有价值的一点就是“坚持”,所以每天我都会主动去看专栏,包括相关书籍以及网上的各类资料。学习到新的知识是一件多么幸福的事情,每天一点点,这日积月累下来就是一笔不小的财富。我们办公室就有一个有趣的墙画,内容就是:
1.01365=37.8;
而 1.02365=1 377.4。
每天跟着专栏去渗透,每一句话都读得很细致,每次看到后一句忘记前面说的都会返回去再读一遍直到弄懂为止。知识一定要彻底掌握才能被更好地使用,这是我个人的要求。需要补充一句,学习的时候切记要结合源码去看,事半功倍

再说专栏的 2 个宝藏之地

除此之外,还有两个我很喜欢的、也很激励我学习的点。
第一个,每一篇文章最后都会有思考题,而思考题的背后就是众多同学的头脑风暴。
每篇文章的留言我都会细细去看,看同学们的回答以及提问我是否了解,如果了解,就暗暗地“得意”一番;如果没有,那就说明我还没完全弄明白,路漫漫仍需继续努力。
所以,留言区也是一个宝藏之地,有些同学的回答甚至可能比老师举的例子更加让人印象深刻,例如《01 | 可见性、原子性和有序性问题:并发编程 Bug 的源头》下的留言,两个字,精彩!当初读完第一章的时候我就暗下决心,绝不能输给这些同学。
这也侧面反映了一点:自己拿一本书去看去学,和你潜意识里知道有很多人在跟你一起学,效果是完全不一样的
第二个,热点问题答疑,这也是宝令老师专栏的特色了。
每一模块的最后都会专门有一篇文章去详细回答各类问题,看这类问题的同时我自己脑子里存储的各类知识也都会融会贯通起来,不知不觉中勾勒出自己的知识全景图,很有成就感。

总结

平心而论,如果不是因为这个专栏,我想我不会学得这么快、学得这么好、中间找工作也找得那么顺利。当初也是被宝令老师的知识总结以及传授方式所吸引,才选择去订阅,看完专栏第一个模块就的确感觉学了很多很多,收获颇丰。
所以,我可以拍胸脯说:这是我订阅的所有专栏里最值的一个!
在结束语中,宝令老师说他自己好为人师,作为读者的我确实感受到了。专栏下面的留言,老师都会耐心去解答,看回复也能收获很多。后续也希望老师能继续输出一些自己的所得和见解,而我们,则站在巨人的肩膀上,遇见我们最美好的风景
在最后,我也附上我自己学习过程中的一些代码积累

宝令老师的回信:

首先,恭喜 Zed 顺利收获一份新工作。我觉得能通过面试只有一个原因就是技术水平过关,并发相关的知识和技术到位,面试自然就轻松了。
感谢你分享的学习方法,尤其是第一点:直接上手跟着敲一遍代码。我们搞工程的必须上手才能理解的更深刻,所以专栏一直都没有给出一份完整的代码,更希望大家自己去动手。
大致浏览了一下你在 Github 分享的代码以及知识点的总结,代码写的很规范,能看出来很用心,我觉得你的新东家眼光很不错!
非常感谢 Zed 及大家,能坚持看完我的专栏,并能运用在实际工作中,真的值了。也欢迎大家把这篇文章分享给朋友,相互学习,互相激励
分享给需要的人,Ta购买本课程,你将得18
生成海报并分享

赞 33

提建议

上一篇
结课测试 | 这些Java并发编程实战的知识你都掌握了吗?
下一篇
3 个用户来信 | 打开一个新的并发世界
unpreview
 写留言

精选留言(21)

  • QQ怪
    2019-06-21
    阅读了zed的心得发现比自己还努力的人还是蛮多的,我会继续加油的😁

    编辑回复: 感谢你的留言及对并发编程专栏的认可,恭喜你获得「10元无门槛礼券」一张,今天20点前到账。打开“极客时间app”-“我的”--“礼券”即可查看。

    18
  • linqw
    2019-06-21
    王宝令老师的这篇专栏真的很值,开启了我对并发编程的大门,记得还没学习这篇专栏,虽然知道信号量(一个整形值、p操作、v操作)和管程(一个锁和0或者多个条件变量),但是不知如何和java联系起来,如java语言层面实现Synchroized+wait、notity、notityAll,只支持一个条件变量,sdk层面实现Lock+condition,支持多个条件变量,也不知道可见性、重排序、原子性产生的原因及对应的解决办法,也学习到java里的并发类在对应的场景使用,也学会如何站在宏观的角度去看多线程问题,跳出来看全景、钻进去看本质,也学到了对应的多线程的设计模式,多线程在各个场景的案例。学完此专栏,在去看java并发包的源码,会发现宏观的学习完,钻进去看源码的时候真的不难,最近也在自己分析java并发包的源码https://juejin.im/user/5bd8718051882528382d8728/posts,持续进化,道阻且长
    展开

    作者回复: 优秀👍

    11
  • 端点星好运
    2019-06-21
    自己是一名高龄Android开发,这个专栏是订阅的专栏里帮助最大的,感谢王老师。👍

    作者回复: 适合就好😄

    6
  • 爱吃回锅肉的瘦子
    2019-06-21
    很感谢老师的课程,刚好学完老师课程,就能在实际工作中使用到,或许是运气好。项目中交易表是按月份分表的,查询一段日期,我就用了forkjoin,以及交易表和其他表汇总。就用了CompletableFuture 。第一次使用异步编程方式进行查询,内心获得很大满足感,毕竟能够学以致用。再次谢谢老师这几十天传道授惑。

    作者回复: 学以致用👍

    4
  • Xiao
    2019-06-21
    学无止境!可以在配合着看看Linux系统组成原理和操作系统原理,能更好理解并发和多线程!
    4
  • 尔冬橙
    2019-07-14
    我在想,面试时打比方举例子,面试官会不会打断
    共 2 条评论
    3
  • 2102
    2019-07-17
    最赞宝令老师对留言区的重视,几乎每个留言都会回复。专栏学习由浅入深,适合所有阶段的学员,完全学完并理解的同学一定会成为并发领域的高手。。

    作者回复: 感谢捧场😄

    2
  • 悠哉小二儿
    2019-06-21
    突然想起任总一句话:优秀的老师教出更优秀的学生

    作者回复: 👍

    1
  • 星朝
    2021-04-15
    感谢王老师帮我开拓了视野,很有帮助
  • 店小二#2
    2020-05-17
    确实收获很大,干货多多。有一些技术工作中确实没接触过,看完宝令老师的专栏再加上实战和拓展学习收获颇丰!
  • 刘善良~
    2020-03-31
    找到工作我在说话把
  • 🐾
    2019-11-08
    相见恨晚的专栏,醍醐灌顶

    作者回复: 相见就好😄

  • 开坦克的贝塔
    2019-09-17
    这个 是zed 的 并发编程的链接吗 https://github.com/Fadezed/concurrency
    共 1 条评论
    1
  • helloworld
    2019-09-12
    1.01的那个算是是2019最触动我的一张图片了,没有之一,只有唯一。
    共 1 条评论
  • 日不落帝国
    2019-08-28
    优秀
  • 业余草
    2019-07-28
    文章中的小数点是亮点
  • 脸不大
    2019-06-26
    通过宝令老师的课可以看出:老师不仅是个技术高手,更是一个对生活有着深刻领悟的人;通过老师讲知识点时举的例子就可以看得出;和Zed一样,我深刻的记得“活锁”是什么,就是俩人进门谦让;“死锁”是什么,就是账本管理员取账本;“等待--通知”是什么,就是医院就医医生通知叫号。。。这些知识点多久之后都不会忘,历历在目,就在两天前,驳回了同事提交的代码pull-request,因为他打印的日志中有这样的写法:logger.debug("The var1:" + var1 + ", var2:" + var2);我立马就给他讲了参数压栈和方法体的执行顺序,学以致用的时候是最开心的时候,感谢老师的精彩讲课,这套课程绝对值得二刷三刷~
    展开

    作者回复: 感谢你如此精彩的解读😄

    共 2 条评论
  • Vincent
    2019-06-25
    感谢宝令老师,这个专栏学到很多,更重要的是对于并发提供了学习细化的框架,学习路线图,很棒

    作者回复: 不用客气😄有收获就好

  • 笨拙的自由
    2019-06-21
    一章不落追完了,现在一想仅仅看过一遍还是不够,想学老师系统的整理一下发到公司内网去,给别人讲一遍才能真正学到东西

    作者回复: 👍

    1
  • 马哲富
    2019-06-21
    同学们,需要着重加强理解的是内存模型和管程;另外需要动手实践

    作者回复: 👍

    1