mirror of
https://github.com/cheetahlou/CategoryResourceRepost.git
synced 2025-11-15 13:43:49 +08:00
mod
This commit is contained in:
70
极客时间专栏/Java并发编程实战/用户故事/3 个用户来信 | 打开一个新的并发世界.md
Normal file
70
极客时间专栏/Java并发编程实战/用户故事/3 个用户来信 | 打开一个新的并发世界.md
Normal file
@@ -0,0 +1,70 @@
|
||||
|
||||
你好,我是王宝令。
|
||||
|
||||
很高兴能再次收到用户的来信,一下子还是 3 封,真是受宠若惊。
|
||||
|
||||
通过大家的来信、留言,我深刻感受到大家学习的欲望和热情,也很感谢你们能跟着我一起,把并发这么难啃的知识点都**“嚼碎了”——“吃下去”——“消化掉”**,变成自己的东西。
|
||||
|
||||
**脚踏实地,才能仰望天空。**
|
||||
|
||||
**来信一:他说,这是一盏明灯,可以带你少走很多弯路,正确前行,野蛮生长。**
|
||||
|
||||
你好,我是笑笑,17届杭师大计算机毕业的学生,现在一个电商互联网公司做 Java开发。
|
||||
|
||||
在没有学习这个专栏之前,我自己也曾读过一些并发编程相关的书,但那时刚毕业,看完后也仅仅是知道了并发的概念、并发产生的原因,以及一些并发工具类的使用,整体处于“了解”阶段,距离“掌握”还很远。所以,看到“极客时间”出并发编程的专栏后,我立马就订阅了。
|
||||
|
||||
**第一个感受:宝令老师的讲解思路特别清晰,由简入深**。为什么会出现这些技术、这些技术带来的影响点以及如何能更合理地使用这些技术等内容,都阐述得清清楚楚。整个专栏下来,宝令老师带我“游览”并看清了并发编程的全貌。
|
||||
|
||||
**第二个感受:清晰简洁,理论和实践并行**。每次读完老师的文章后,先前很多模糊的知识点都变得更加地清晰,比如:
|
||||
|
||||
1. 可见性是由于在多核时代,每颗CPU都有自己的缓存导致的,具体看[《01 | 可见性、原子性和有序性问题:并发编程Bug的源头》](https://time.geekbang.org/column/article/83682);
|
||||
1. 锁要和资源关联起来,一个锁可以锁多个资源,但是一个资源不可以用多个锁,可类比球赛门票的管理,点击温故[《03 | 互斥锁(上):解决原子性问题》](https://time.geekbang.org/column/article/84344);
|
||||
1. Java 线程的生命周期与操作系统线程生命周期的相通点以及区别,可参考[《09 | Java线程(上):Java线程的生命周期》](https://time.geekbang.org/column/article/86366);
|
||||
<li>结合例子来带你理解 Happens-Before 规则,具体看[《02 | Java内存模型:看Java如何解决可见性和有序性问题》](https://time.geekbang.org/column/article/84017)。<br>
|
||||
……</li>
|
||||
|
||||
总之 ,十分感谢宝令老师这几个月的付出。想必很多同学都跟我一样,不能说看了专栏我们并发的能力一下子变得多么多么厉害(这也不现实)。但,**它绝对是一盏明灯,给我们指明了方向,让我们在并发的道路上少走很多弯路,正确前行,野蛮生长**。
|
||||
|
||||
**宝令回信:**
|
||||
|
||||
很高兴能够为你答疑解惑,学习最怕的是没问题,只要有问题就一定能找到答案,探索的过程就是提升的过程。也感谢你这几个月的支持和信任!
|
||||
|
||||
**来信二:他说,于是,我有了自己的“Java并发编程全景图”。**
|
||||
|
||||
你好,我是华应,互联网行业的一名非著名程序员。
|
||||
|
||||
关于并发编程的学习,我也曾多次尝试学习,从不同的切入点或者方法学习过,但都不得要领。 看了宝令老师专栏的试读文章后,我发现每句话都戳中自己学习过程中的痛处,就决定跟着了。
|
||||
|
||||
让我印象比较深刻的是,在第一部分“并发理论基础”的最后,老师专门拿出了一篇文章来为大家答疑,每个问题都非常经典,涉及到CPU、缓存、内存、IO、并发编程相关的操作系统层面的线程、锁、指令等知识点,为我打开了并发新世界。同时,我把难啃的知识放在了自己技能全景图中,时时温故知新。
|
||||
|
||||
总体来说,学习完这个专栏后,我获益良多,**不仅是对并发编程有了系统化的理解,也第一次针对并发编程绘制出了自己的全景图**(如下图)。生有涯而学无涯,相信这些知识图谱定能给我指明前进方向,点亮我的技术人生。
|
||||
|
||||
真心谢谢宝令老师,希望老师能再出更多的专栏,我们江湖再见!
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/f2/24/f2351fe16ea4d0533f1a3bc1d32a2624.png" alt="">
|
||||
|
||||
**宝令回信:**
|
||||
|
||||
系统化地学习很重要,这样遇到问题不会迷茫。感谢你分享的全景图,教学相长,我们互相学习!
|
||||
|
||||
**来信三:他说,如今每做一个需求,都会对其资源消耗、时间损耗和并发安全有进一步的思考和优化。**
|
||||
|
||||
你好,我是小肖,在深圳的一家金融公司负责后端业务开发。
|
||||
|
||||
想起学并发编程,是**因为在找工作时,经常会有面试官问我有没有并发经验,这时我才意识到自己在并发方面的不足**。但由于整天沉浸在各种业务代码的CRUD中,而且公司用户数量不大,导致自己接触的并发场景少,完全缺少理论+实战经验。
|
||||
|
||||
所以当“极客时间”出了《Java并发编程实战》这门课后,我立马就订阅了,同时也对宝令老师的分享充满了期待。
|
||||
|
||||
事实证明,老师分享的知识深度广度让我叹为观止,干货非常之多,许多知识也很贴近实战。比如,在第二部分“并发工具类”的14篇文章里,我跟着学会了如何用多线程并行操作来优化程序执行时间,以及如何用线程通信来让程序执行得更高效。
|
||||
|
||||
就这样,从头到尾跟下来后,我收获颇丰!
|
||||
|
||||
现在,我也尝试着把我学到的知识点用于项目中,不断优化自己的代码。**如今我开始每做一个需求,都会对其资源消耗、时间损耗和并发安全多进行一步思考和优化**。这些都为我的项目成功上线起到了重要的保障作用,我的同事也开始夸奖我并发方面的表现突出。这是我最开心和欣慰的地方。
|
||||
|
||||
由此,我想感谢宝令老师,是发自内心且由衷地感谢。感谢老师这几个月的一直陪伴,感谢老师分享的知识让我向着理想更进了一步,感谢老师怀揣着对技术的执着之心激励我初心依旧。
|
||||
|
||||
**宝令回信:**
|
||||
|
||||
你这么快就能在工作中熟练使用了,这是我最开心和欣慰的地方。学会怎么思考并且在工作中实践,进步一定很快。祝在工作中更上一层楼!
|
||||
|
||||
|
||||
116
极客时间专栏/Java并发编程实战/用户故事/用户来信 | 真好,面试考到这些并发编程,我都答对了!.md
Normal file
116
极客时间专栏/Java并发编程实战/用户故事/用户来信 | 真好,面试考到这些并发编程,我都答对了!.md
Normal file
@@ -0,0 +1,116 @@
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/22/57/228d35b6802062d21d3391c6b54ad757.jpg" alt="unpreview">
|
||||
|
||||
你好,我是Zed,是《Java并发编程实战》1W+订阅者中的一员。
|
||||
|
||||
我从事Java开发已有五年时间了,曾在一家国内知名物流企业工作,现在杭州一家金融支付类公司继续担任Java工程师一职。
|
||||
|
||||
大概在今年四月份,在高铁上翻到一篇文章,讲的是“为什么Object.wait()方法一定要在synchronized内部使用”,因为之前我根本不知道这个问题,所以打算考考我朋友。
|
||||
|
||||
结果他给了我一些迥然不同的答案,并邀请我读了宝令老师的《Java并发编程实战》专栏中的一篇文章[《08 | 管程:并发编程的万能钥匙》](https://time.geekbang.org/column/article/86089),看完后我感觉醍醐灌顶,津津有味,果断开始学习。
|
||||
|
||||
## 我是如何通过专栏拿到 Offer 的?
|
||||
|
||||
机缘巧合,专栏学习到一半时 ,我辞掉了原有的工作出去面试。因为面试的岗位都是高级工程师,所以基本上离不开并发编程的问题,**像锁、线程安全、线程池、并发工具类都是家常便饭**。
|
||||
|
||||
印象比较深刻的是面试官问我:**线程池的大小如何确定**?
|
||||
|
||||
那时我刚看完[《10 | Java线程(中):创建多少线程才是合适的?》](https://time.geekbang.org/column/article/86666),然后就胸有成竹且不紧不慢地回答了,面试官听了直点头。
|
||||
|
||||
另外一个问题是:**怎么理解活锁**?
|
||||
|
||||
于是,我又如法炮制搬出了[《07 | 安全性、活跃性以及性能问题》](https://time.geekbang.org/column/article/85702)中老师提到“路人甲乙相撞”的例子,同时给出具体的解决方案。
|
||||
|
||||
不得不说,这个例子太经典了,这里我必须再展示给大家看!在文章里老师是这样描述**活锁**的:
|
||||
|
||||
>
|
||||
所谓的“活锁”,可以类比现实世界里的例子。路人甲从左手边出门,路人乙从右手边进门,两人为了不相撞,互相谦让,路人甲让路走右手边,路人乙也让路走左手边,结果是两人又相撞了。
|
||||
<blockquote>
|
||||
|
||||
这种情况,基本上谦让几次就解决了,因为人会交流啊。可是如果这种情况发生在编程世界了,就有可能会一直没完没了地“谦让”下去,成为没有发生阻塞但依然执行不下去的“活锁”。
|
||||
|
||||
并且给出了简单有效的**解决方案**:
|
||||
|
||||
>
|
||||
解决“活锁”的方案很简单:谦让时,尝试等待一个随机的时间就可以了。
|
||||
<blockquote>
|
||||
|
||||
例如上面的那个例子,路人甲走左手边发现前面有人,并不是立刻换到右手边,而是等待一个随机的时间后,再换到右手边;同样,路人乙也不是立刻切换路线,也是等待一个随机的时间再切换。由于路人甲和路人乙等待的时间是随机的,所以同时相撞后再次相撞的概率就很低了。
|
||||
|
||||
>
|
||||
|
||||
“等待一个随机时间”的方案虽然很简单,却非常有效,Raft这样知名的分布式一致性算法中也用到了它。
|
||||
|
||||
真的很庆幸提前遇到了并发专栏,我的面试顺利通过了。
|
||||
|
||||
我可以很负责任地说,如果没有专栏的学习,我不会那么顺利地找到工作。换句话说,**专栏其实涵盖了几乎所有大家面试可能会被问到的内容**。
|
||||
|
||||
## 我是如何进行高效学习的呢?
|
||||
|
||||
### 第一,直接上手跟着敲一遍代码。
|
||||
|
||||
我觉得最能表示你在用心学习的方式就是**付诸实际行动**了,就拿专栏第一模块“并发理论基础”来讲,会涉及到很多的例子,比如:
|
||||
|
||||
- 可见性、原子性等问题的举例说明,直接看[《01 | 可见性、原子性和有序性问题:并发编程Bug的源头》](https://time.geekbang.org/column/article/83682);
|
||||
- 用“银行转账模拟”的例子引出死锁问题并如何处理,[《05 | 一不小心就死锁了,怎么办?》](https://time.geekbang.org/column/article/85001);
|
||||
- 如何保证线程安全的同时保证性能,[《06 | 用“等待-通知”机制优化循环等待》](https://time.geekbang.org/column/article/85241)。
|
||||
- ……
|
||||
|
||||
针对这些例子,我能做的就是自己花时间,手动敲一遍代码。要知道,纸上得来终觉浅,绝知此事要躬行!
|
||||
|
||||
### 第二,换位理解。
|
||||
|
||||
这也是我觉得最为有效的学习方式之一,**站在老师角度,去思考他是如何看这个问题的,他是如何一步步讲解清楚的**。而且,宝令老师在每篇文章后面,都会有一段总结,非常有效地来帮助我去获得这篇文章的知识点。**提出问题—解决问题—总结得出结论,这关键的三步,在任何地方都适用**。
|
||||
|
||||
所以,我还会花时间思考专栏的“这里”或“那里”跟我之前的理解是否有出入,例如[《11 | Java线程(下):为什么局部变量是线程安全的?》](https://time.geekbang.org/column/article/86695)中对局部变量线程安全的解释,跟自己了解的虚拟机执行过程变量共享关系是否吻合?
|
||||
|
||||
**反复问自己问题的答案是什么,然后和老师的理解做对比**,收获感和进步才会是巨大的。
|
||||
|
||||
### 第三,坚持,坚持,再坚持。
|
||||
|
||||
学习最难的也是最有价值的一点就是“**坚持**”,所以每天我都会主动去看专栏,包括相关书籍以及网上的各类资料。学习到新的知识是一件多么幸福的事情,每天一点点,这日积月累下来就是一笔不小的财富。我们办公室就有一个有趣的墙画,内容就是:
|
||||
|
||||
而1.02<sup>365</sup>=1 377.4。
|
||||
|
||||
每天跟着专栏去渗透,每一句话都读得很细致,每次看到后一句忘记前面说的都会返回去再读一遍直到弄懂为止。**知识一定要彻底掌握才能被更好地使用**,这是我个人的要求。需要补充一句,**学习的时候切记要结合源码去看,事半功倍**!
|
||||
|
||||
## 再说专栏的 2 个宝藏之地
|
||||
|
||||
除此之外,还有两个我很喜欢的、也很激励我学习的点。
|
||||
|
||||
**第一个,每一篇文章最后都会有思考题,而思考题的背后就是众多同学的头脑风暴。**
|
||||
|
||||
每篇文章的留言我都会细细去看,看同学们的回答以及提问我是否了解,如果了解,就暗暗地“得意”一番;如果没有,那就说明我还没完全弄明白,路漫漫仍需继续努力。
|
||||
|
||||
所以,**留言区也是一个宝藏之地**,有些同学的回答甚至可能比老师举的例子更加让人印象深刻,例如[《01 | 可见性、原子性和有序性问题:并发编程Bug的源头》](https://time.geekbang.org/column/article/83682)下的留言,两个字,精彩!当初读完第一章的时候我就暗下决心,绝不能输给这些同学。
|
||||
|
||||
这也侧面反映了一点:**自己拿一本书去看去学,和你潜意识里知道有很多人在跟你一起学,效果是完全不一样的**。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/d5/13/d5e1a7d0a501e8e19b78ef81d3a11413.jpg" alt="">
|
||||
|
||||
**第二个,热点问题答疑,这也是宝令老师专栏的特色了。**
|
||||
|
||||
每一模块的最后都会专门有一篇文章去详细回答各类问题,看这类问题的同时我自己脑子里存储的各类知识也都会融会贯通起来,不知不觉中**勾勒出自己的知识全景图**,很有成就感。
|
||||
|
||||
## 总结
|
||||
|
||||
平心而论,**如果不是因为这个专栏,我想我不会学得这么快、学得这么好、中间找工作也找得那么顺利**。当初也是被宝令老师的知识总结以及传授方式所吸引,才选择去订阅,看完专栏第一个模块就的确感觉学了很多很多,收获颇丰。
|
||||
|
||||
所以,我可以拍胸脯说:这是我订阅的所有专栏里最值的一个!
|
||||
|
||||
在结束语中,宝令老师说他自己好为人师,作为读者的我确实感受到了。专栏下面的留言,老师都会耐心去解答,看回复也能收获很多。后续也希望老师能继续输出一些自己的所得和见解,而我们,则**站在巨人的肩膀上,遇见我们最美好的风景**!
|
||||
|
||||
在最后,我也附上我自己学习过程中的[一些代码积累](https://github.com/Fadezed/concurrency)。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/3b/db/3bff102888cec5c7bfbc35a1fdeda0db.jpg" alt="">
|
||||
|
||||
## 宝令老师的回信:
|
||||
|
||||
首先,恭喜 Zed 顺利收获一份新工作。我觉得能通过面试只有一个原因就是**技术水平过关,并发相关的知识和技术到位,面试自然就轻松了。**
|
||||
|
||||
**感谢你分享的学习方法,尤其是第一点:直接上手跟着敲一遍代码。**我们搞工程的必须上手才能理解的更深刻,所以专栏一直都没有给出一份完整的代码,更希望大家自己去动手。
|
||||
|
||||
**大致浏览了一下你在 Github 分享的代码以及知识点的总结,代码写的很规范,能看出来很用心**,我觉得你的新东家眼光很不错!
|
||||
|
||||
非常感谢 Zed 及大家,能坚持看完我的专栏,并能运用在实际工作中,真的值了。**也欢迎大家把这篇文章分享给朋友,相互学习,互相激励**。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user