代码精进之路
范学雷
Oracle首席软件工程师,Java SE安全组成员,OpenJDK评审成员
立即订阅
6349 人已学习
课程目录
已完结 47 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你写的每一行代码,都是你的名片
免费
第一模块:代码“规范”篇 (16讲)
01 | 从条件运算符说起,反思什么是好代码
02 | 把错误关在笼子里的五道关卡
03 | 优秀程序员的六个关键特质
04 | 代码规范的价值:复盘苹果公司的GoToFail漏洞
05 | 经验总结:如何给你的代码起好名字?
06 | 代码整理的关键逻辑和最佳案例
07 | 写好注释,真的是小菜一碟吗?
08 | 写好声明的“八项纪律”
09 | 怎么用好Java注解?
10 | 异常处理都有哪些陷阱?
11 | 组织好代码段,让人对它“一见钟情”
12丨组织好代码文件,要有“用户思维”
13 | 接口规范,是协作的合约
14 | 怎么写好用户指南?
15 | 编写规范代码的检查清单
16丨代码“规范”篇用户答疑
第二模块:代码“经济”篇 (14讲)
17 | 为什么需要经济的代码?
18丨思考框架:什么样的代码才是高效的代码?
19 | 怎么避免过度设计?
20 | 简单和直观,是永恒的解决方案
21 | 怎么设计一个简单又直观的接口?
22丨高效率,从超越线程同步开始!
23 | 怎么减少内存使用,减轻内存管理负担?
24 | 黑白灰,理解延迟分配的两面性
25 | 使用有序的代码,调动异步的事件
26 | 有哪些招惹麻烦的性能陷阱?
27 | 怎么编写可持续发展的代码?
28 | 怎么尽量“不写”代码?
29 | 编写经济代码的检查清单
30丨“代码经济篇”答疑汇总
第三模块:代码“安全”篇 (14讲)
31 | 为什么安全的代码这么重要?
32 | 如何评估代码的安全缺陷?
33 | 整数的运算有哪些安全威胁?
34 | 数组和集合,可变量的安全陷阱
35 | 怎么处理敏感信息?
36 | 继承有什么安全缺陷?
37 | 边界,信任的分水岭
38 | 对象序列化的危害有多大?
39 | 怎么控制好代码的权力?
40 | 规范,代码长治久安的基础
41 | 预案,代码的主动风险管理
42 | 纵深,代码安全的深度防御
43 | 编写安全代码的最佳实践清单
44 | “代码安全篇”答疑汇总
加餐 (1讲)
Q&A加餐丨关于代码质量,你关心的那些事儿
结束语 (1讲)
结束语|如何成为一个编程好手?
代码精进之路
登录|注册

22丨高效率,从超越线程同步开始!

范学雷 2019-02-22
线程的同步是学习一门编程语言的难点。刚开始线程同步的困难,主要在于了解技术;跨过了基本技术的门槛后,更难的是掌握最基本的概念。
学习技术时,我们对基本概念熟视无睹,只想将宝剑尽快握在手,哪管宝剑何时该挥出的教导。学会技术后,基本概念就会回来找我们算旧账,出错一次剑,就记一笔账。账本慢慢变厚的过程,也是我们向基本概念靠拢的过程。当我们掌握了最基本的概念后,开始慢慢还账,账本再越变越薄。
不单单是线程和同步,掌握好基本概念,几乎是我们学习所有技术背后的困境。这怨不得我们自己,我们认识一件事情的过程,大抵就是这样。
如果有人很早地就敲着桌子,不厌其烦地重复着基本的概念,事情会不会容易一些?这一次,我们聊聊线程同步的基本概念,以及如何超越线程同步。

什么时候需要同步?

线程有两个重要的特征,就是并发执行和共享进程资源。
你可以把进程想象成一个鱼缸。鱼缸里的金鱼可以看作线程。鱼缸里的碎石、水草、鱼食等可以看作共享的资源。每一条鱼都独立行动,随时可以吐个气泡,吃点鱼食,耍弄下水草。
鱼缸里的碎石、水草,小鱼儿搬不走、吃不掉,是一个不变的量。鱼食和气泡就不一样了,每一条小鱼儿随时都会吐泡泡、吃鱼食,改变气泡和鱼食的数量。鱼食和气泡,是鱼缸里的可变量。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《代码精进之路》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(4)

  • 唐名之
    学习总结:
    1:多线程具备并行和共享资源特性,多核cpu并行可加快执行速度但需谨慎共享资源带来的隐患;
    2:多线程中使用单例对象,工具类都需注意多线程安全问题;
    3:优化同步,加锁粒度尽量控制更细,尽量减少阻塞时间;
    2019-02-22
    9
  • 克里斯
    刚工作一年的程序员小嫩鱼,一直很想成为一种人:思维清晰,思路快。

    团队也有一些思路严谨的同事,然而问他如何思考问题的,他也只是说多思考多想;问一些代码写的好的同事,他们也说不出所以然。所以决定开始了自己的求索之路。

    带我入门的是极客时间 刘超《趣谈网络协议》,最大的收获就是感觉理解技术代表的“需求(或者说是what+why)”才是理解技术的核心所在。

    一直感觉自己代码写的不好,看了一些技术书,基本上也是介绍一些知识性的细节,基本也是技术的语法和常见的注意事项。实践了一段时间,感觉自己没有什么提升,无论是阅读代码还是写代码。

    就开始找代码重构之类的书,很庆幸自己读了《head first 设计模式》。这本书基本上是我觉得写的最浅显也是最深刻的书籍了,我认为是扫地僧级别的。但是很多觉得知识才是王道的人,发现不了这本书的能量之大。也是在这本书我了解到了思考需求应该如何落地,以及应该考虑哪些未知变化,也就是(how+if)。

    后来追本溯源,发现了逻辑学教材《金字塔原理》,系统的了解了思维的结构,但是实践却需要我一辈子去努力。

    读到范前辈的文章时,我更加确定了一个优秀的学者是什么思维,感谢你们的课程,让我更加确信这是一条无论怎么努力都不为过的道路。
    2019-05-04
    6
  • Sisyphus235
    先将启动 signature 的部分拆分出来生成一个类,完成 verification 和 signing 的初始化。更新的方法放在一个类中扩展 signature,这样所有修改的值都是一个对象的属性值,这样会不会多线程安全?

    作者回复: 有一个思路,就是把update()的逻辑内部化,比如使用Stream而不是byte[]。没有了update()方法,这个类重构起来就方便多了。

    2019-05-23
    1
  • kelvin
    这个线程安全怎么定义呢?是要一个线程改变内容不影响另外一个线程的数据,还是只是不能同步修改数据。如果是第一种可以把数据拆分成一个类,每次把数据传递进入。第二种只要在临界代码加锁就可以。
    2019-06-15
收起评论
4
返回
顶部