NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

从事 Java 开发 5 年,才意识到“学好并发”的重要性 | 极客时间

  • 2019-06-24
  • 本文字数:2490 字

    阅读完需:约 8 分钟

从事 Java 开发 5 年,才意识到“学好并发”的重要性 | 极客时间

你好,我是 Zed,是《Java 并发编程实战》1W+订阅者中的一员。


我从事 Java 开发已有五年时间了,曾在一家国内知名物流企业工作,现在杭州一家金融支付类公司继续担任 Java 工程师一职。


大概在今年四月份,在高铁上翻到一篇文章,讲的是“为什么 Object.wait()方法一定要在 synchronized 内部使用”,因为之前我根本不知道这个问题,所以打算考考我朋友。


结果他给了我一些迥然不同的答案,他邀请我读了宝令老师的《Java 并发编程实战》专栏中的一篇文章《08 | 管程:并发编程的万能钥匙》,看完后我感觉醍醐灌顶,津津有味,果断开始学习。

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

机缘巧合,专栏学习到一半时 ,我辞掉了原有的工作出去面试。因为面试的岗位都是高级工程师,所以基本上离不开并发编程的问题,像锁、线程安全、线程池、并发工具类都是家常便饭。


印象比较深刻的是面试官问我:线程池的大小如何确定?


那时我刚看完《10|Java线程(中): 创建多少线程才是合适的?》,然后就胸有成竹且不紧不慢地回答了,面试官听了直点头。


另外一个问题是:怎么理解活锁?


于是,我又如法炮制搬出了《07|安全性、活跃性以及性能问题》中老师提到“路人甲乙相撞”的例子,同时给出具体的解决方案。


不得不说,这个例子太经典了,这里我必须再展示给大家看!在文章里老师是这样描述活锁的:


所谓的“活锁”,可以类比现实世界里的例子。路人甲从左手边出门,路人乙从右手边进门,两人为了不相撞,互相谦让,路人甲让路走右手边,路人乙也让路走左手边,结果是两人又相撞了。



这种情况,基本上谦让几次就解决了,因为人会交流啊。可是如果这种情况发生在编程世界了,就有可能会一直没完没了地“谦让”下去,成为没有发生阻塞但依然执行不下去的“活锁”。


并且给出了简单有效的解决方案


解决“活锁”的方案很简单:谦让时,尝试等待一个随机的时间就可以了。



例如上面的那个例子,路人甲走左手边发现前面有人,并不是立刻换到右手边,而是等待一个随机的时间后,再换到右手边;同样,路人乙也不是立刻切换路线,也是等待一个随机的时间再切换。由于路人甲和路人乙等待的时间是随机的,所以同时相撞后再次相撞的概率就很低了。



“等待一个随机时间”的方案虽然很简单,却非常有效,Raft 这样知名的分布式一致性算法中也用到了它。


真的很庆幸提前遇到了并发专栏,我的面试顺利通过了。


我可以很负责任地说,如果没有专栏的学习,我不会那么顺利地找到工作。换句话说,专栏其实涵盖了几乎所有大家面试可能会被问到的内容。(文末有专栏的优惠活动,有兴趣的直接拉到下面)

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

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

我觉得最能表示你在用心学习的方式就是付诸实际行动了,就拿专栏第一模块“并发理论基础”来讲,会涉及到很多的例子,比如:



针对这些例子,我能做的就是自己花时间,手动敲一遍代码。要知道,纸上得来终觉浅,绝知此事要躬行!

第二,换位理解。

这也是我觉得最为有效的学习方式之一,站在老师角度,去思考他是如何看这个问题的,他是如何一步步讲解清楚的。而且,宝令老师在每篇文章后面,都会有一段总结,非常有效地来帮助我去获得这篇文章的知识点。提出问题—解决问题—总结得出结论,这关键 3 步,在任何地方都适用。


所以,我还会花时间思考专栏的“这里”或“那里”跟我之前的理解是否有出入,例如《11 | Java线程(下):为什么局部变量是线程安全的?》中对局部变量线程安全的解释,跟自己了解的虚拟机执行过程变量共享关系是否吻合?


反复问自己问题的答案是什么,然后和老师的理解做对比,收获感和进步才会是巨大的。

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

学习最难的也是最有价值的一点就是“坚持”了,这一点毋庸置疑,所以每天我都会主动去看专栏,包括相关书籍以及网上的各类资料。学习到新的知识是一件多么幸福的事情,每天一点点,这日积月累下来就是一笔不小的财富。我们办公室就有一个有趣的墙画,内容就是:


1.01^365=37.8;


而 1.02^365=1 377.4。


每天跟着专栏去渗透,每一句话都读得很细致,每次看到后一句忘记前面说的都会返回去再读一遍直到弄懂为止。知识一定要彻底掌握才能被更好地使用,这是我个人的要求。需要补充一句,学习的时候切记要结合源码去看,事半功倍

再说专栏的 2 个宝藏之地

除此之外,还有两个我很喜欢的、也很激励我学习的点。


第一个,每一篇文章最后都会有思考题,而思考题的背后就是众多同学的头脑风暴。


每篇文章的留言我都会细细去看,看同学们的回答以及提问我是否了解,如果了解,就暗暗地“得意”一番;如果没有,那就说明我还没完全弄明白,路漫漫仍需继续努力。


所以,留言区也是一个宝藏之地,有些同学的回答甚至可能比老师举的例子更加让人印象深刻,例如《01 | 可见性、原子性和有序性问题:并发编程Bug的源头》下的留言,两个字,精彩!当初读完第一章的时候我就暗下决心,绝不能输给这些同学。


这也侧面反映了一点:自己拿一本书去看去学,和你潜意识里知道有很多人在跟你一起学,效果是完全不一样的。



第二个,热点问题答疑,这也是宝令老师专栏的特色了。


每一模块的最后都会专门有一篇文章去详细回答各类问题,看这类问题的同时我自己脑子里存储的各类知识也都会融会贯通起来,不知不觉中勾勒出自己的知识全景图,很有成就感。


专栏下面的留言,老师都会耐心去解答,看回复也能收获很多。后续也希望老师能继续输出一些自己的所得和见解,而我们,则站在巨人的肩膀上,遇见我们最美好的风景!


在最后,我也附上我自己学习过程中的一些代码积累



今天小编也给大家申请到了《Java并发编程》的限时优惠福利:优惠价 79,原价 99,只有 24 小时。此专栏已有 1.1w 程序员订阅,评价都很高。


截点大家的评论给你。



想要系统学习 Java 并发的同学,赶紧搭上这辆完结福利车。


2019-06-24 18:467016

评论 1 条评论

发布
用户头像
这广告做的真恶心
2019-07-02 09:00
回复
没有更多了
  • 10 分钟带你彻底搞懂 DDD 开发框架 Axon

    讲师介绍: 萧亦然,资深技术专家、TGO 鲲鹏会会员、阿里云 MVP、腾讯云 TVP。 问题背景: 当下,随着微服务架构的不断发展,领域驱动设计(DDD)也得到了越来越多的应用。但业界并没有针对如何实现 DDD 中聚合、领域事件等复杂概念提供统一的开发规范。在这个背景下,开发人员迫切希望能够引入即插即用的开源框架,来简化 DDD 应用程序的开发过程,Axon就是这样一款开发框架。 内容看点: Axon 的技术组件 Axon 的应用方式

    2022-03-15

  • 对比 volatile vs synchornized

    你好,我是悟空呀。今天我们学习下 volatile 和 synchornized。

    2021-12-05

  • 【薪火计划】11 - 学习总结

    历时三个月的学习,给我的感觉就是,对管理有了更为清晰的认知,以前自己是摸石头过河,有些东西似是而非,很难判断什么样的方式,或者说什么样的思路是正确的,但是经过这段时间的学习,自己好像在迷雾中突然看见了明灯,可以看见前方的路况。如果说这段时间

    2021-01-11

  • 热点面试题:聊聊对 this 的理解?

    欢迎关注 『前端进阶圈』 公众号 ,一起探索学习前端技术......

    2023-02-28

  • 和老大的相爱相杀中, 让我终于搞懂了函数式接口

    Hi,大家好,我是麦洛。我又回来啦🙈

    2021-04-10

  • 用户故事|罗杰:我的 Go 语言学习之路

    今天,我们邀请了一位用户和你分享一下他学习Go的一些经历,如果你还是一个Go新人,希望他的这些经历,能给你带来一些启发和帮助。

    2021-12-27

  • 10 分钟带你彻底搞懂迭代器设计模式

    2022-07-08

  • 11. Java 客户端 -Jedis

    2023-02-15

  • 说说 Golang goroutine 并发那些事儿

    摘要:今天我们一起盘点一下Golang并发那些事儿。

    2021-02-09

  • 与前端训练营的日子 --Week06

    又过了一周,这周的学习强度蛮大的,有11节课,虽然要理解完还需要时间,但也懵懵懂懂地完成了学习任务🤣。

    2020-12-07

  • 为什么学 Go(一)

    "为什么学Go"是一系列文章,这里并不介绍如何学习Go,很多同学最近在问我要不要学Go。这是一个很大的问题,就是我为什么学Go?Go究竟是什么东西?带着这些疑问,我们先去了解Go和它背后的故事。

    2020-10-14

  • 快速掌握并发编程 --- 深入学习 ThreadLocal

    考试题只有一套,老师把考试题打印出多份,发给每位考生,然后考生各自写各自的试卷。考生之间不能相互交头接耳(会当做作弊)。各自写出来地答案不会影响他人的分数。

    2020-11-02

  • 一个茶艺师转型程序员的小故事

    一个茶艺师转型程序员的小故事

  • 给弟弟的信第 16 封|人为什么会抑郁

    最近被一条新闻刷屏,腾讯游戏开发大神毛星云跳楼身亡,据传他生前抑郁,曾住院。他当时的心理活动和具体情况我们不得而知,只能愿生者安好,愿逝者安息。近些年来,抑郁这个词出现的频率好像越来越高,原苏宁科技集团副总裁乔新亮在他的极客时间专栏中也写到

    2021-12-18

  • 不服不行,黑马 java 教学多线程 pdf,腾讯 T3 大牛总结

    在写这个文章之前,我花了点时间,自己臆想了一个电商系统,基本上算是麻雀虽小五脏俱全,我今天就用它开刀,一步步剖析,我会讲一下我们可能会接触的技术栈可能不全,但是够用,最后给个学习路线。

    2021-10-26

  • 10 天拿到阿里 Java 岗 offer,准备 Java 面试

    在写这个文章之前,我花了点时间,自己臆想了一个电商系统,基本上算是麻雀虽小五脏俱全,我今天就用它开刀,一步步剖析,我会讲一下我们可能会接触的技术栈可能不全,但是够用,最后给个学习路线。

    2021-09-23

  • 10 分钟带你彻底搞懂 MyBatis-Spring 启动过程工作原理

    对于目前主流的开源框架而言,研究它们的启动过程非常有助于我们把握框架的实现原理。而对于那些专门用来实现不同框架之间整合的技术组件而言,通常都会应用到框架的一些核心功能特性,值得我们深入分析。这节课,我将和你一起探讨 MyBatis-Spring 组件的启动过程,在这个启动过程中,完成了 MyBatis 与 Spring 这两个框架之间的无缝集成。 讲师介绍 萧亦然,资深技术专家、TGO 鲲鹏会会员、阿里云 MVP、腾讯云 TVP。 内容看点 MyBatis 和 Spring 的集成过程 SqlSession 和 Mapper 获取过程和原理 SqlSessionTemplate 线程安全性分析

    2022-10-14

  • 83|关系型数据库:怎样使用关系型数据库?

    2023-01-11

  • 这本书押中了 2022 北京高考作文题!

    今天中午收到一位读者反馈,《学习的学问》命中了2022年的高考作文。而这位读者,正好在考前读了《学习的学问》。

    2022-06-08

  • 【死磕 Java 并发】----- 深入分析 synchronized 的实现原理

    记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道synchronize

    2021-11-04

发现更多内容

三分钟永久激活WebStorm、PHPStorm、PyCharm、IntelliJ IDEA等JetBrains系列IDE

echeverra

pycharm webstorm IntelliJ IDEA PHPStorm

【云图说】DRS数据对比——带您随时观测数据一致性

华为云数据库小助手

GaussDB 华为云数据库 华为云DRS

直接破防了,阿里大咖DDD(领域驱动设计)不破不立,GitHub直接霸榜,今天share给大家~

编程 程序员 领域驱动

墨天轮国产数据库沙龙 | 胡彦军:华为GaussDB迁移工具解密

墨天轮

数据库 华为云 GaussDB 国产数据库

2022第十五届北京国际智慧城市、物联网、大数据博览会

InfoQ_caf7dbb9aa8a

识别AI换脸!百度这项技术夺冠了!

百度开发者中心

AI

成为弹唱高手的秘诀!看这一篇就足够!

懒得勤快

华为初面+综合面试(Java技术面)附上面试题,share给大家~

Java 编程 程序员 面试

SphereEx 中文开源社区正式开站!精美礼品等你来拿

SphereEx

开源社区 ShardingSphere SphereEx Apache ShardingSphere 中文开源

Forrester发布「2021年低代码平台中国市场现状分析报告」,钉钉宜搭入选

一只大光圈

低代码 数字化转型 低代码开发 低代码平台 钉钉宜搭

Linux应该怎么学?《Linux一学就会》教你如何学习Linux

侠盗安全

Linux linux运维 云计算架构师

敏捷开发框架

PingCode

Scrum 敏捷开发 PingCode

手写自定义迭代器,秒懂迭代器底层原理

Tom弹架构

Java 架构 设计模式

数据基础设施支撑电力人工智能:新能源集控智能管理

EMQ映云科技

人工智能 物联网 电力

恒源云(GPUSHARE)_云GPU服务器如何使用 JupyterLab?

恒源云

深度学习

在线问诊系统功能以及快速发展的意义

风行无疆

gitlab registry占用存储过大问题解决

ilinux

编解码再进化:Ali266 与下一代视频技术

阿里云视频云

阿里云 音视频 视频编码 视频编解码 视频云

恒源云(GPUSHARE)_云GPU服务器如何使用 TensorBoard?

恒源云

深度学习

浅谈网络性能之端到端业务质量分析

鲸品堂

运营商

Flink Sort-Shuffle 实现简介

Apache Flink

大数据 flink 实时计算

勒索软件即服务与IAB产业浅析

腾讯安全云鼎实验室

安全攻防 勒索病毒

Python Qt GUI设计:信号与槽的使用方法(基础篇—7)

不脱发的程序猿

Python qt PyQt GUI

同城本地生活信息服务软件开发你知道多少?

风行无疆

全能文件恢复软件推荐

淋雨

数据恢复

CODING Compass —— 打造行云流水般的软件工厂

CODING DevOps

DevOps 研发管理工具 流程化

【重磅官宣】UDC2022:解码Z世代、力造科技潮生活

科技热闻

自定义View:如何实现双击点放大图片控件

Changing Lin

11月日更

(文末福利)云上论剑,谈谈如何构建新的数据系统技术体系

Zilliz

数据库

何止一个惨字形容,水滴Java面试一轮游,壮烈了,问啥啥不会,数据库血崩,我该怎么办?

Java 编程 程序员 面试

浏览器的几种防护策略

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

从事 Java 开发 5 年,才意识到“学好并发”的重要性 | 极客时间_语言 & 开发_Zed_InfoQ精选文章