代码精进之路
范学雷
Oracle首席软件工程师,Java SE安全组成员,OpenJDK评审成员
立即订阅
6350 人已学习
课程目录
已完结 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讲)
结束语|如何成为一个编程好手?
代码精进之路
登录|注册

30丨“代码经济篇”答疑汇总

范学雷 2019-03-13
到这一篇文章,意味着专栏第二模块“经济的代码”已经更新完毕了。非常感谢同学们积极踊跃地留言,提出了很多独到的见解,我自己也学到了不少新东西。
今天,我来集中解答一下留言区里的一些疑问。有很多问题,我们已经在留言区里讨论了。这里,我们就挑选一些还没有解决掉的问题,深入讨论一下。
@秦凯
对性能和资源消耗有一定的意识,但是在具体的开发过程中或者应用运行过程中要对性能进行监控、评测、分析,就束手无策了。
:我一直都认为,有了意识,其实就成功一大半了。有了意识,我们就会去寻找技术,寻找工具,寻找解决的办法。到了这个专栏的第三个部分(也是接下来要更新的“安全篇”),我们就会更强烈地感受到,“要有意识”是我们首先要获得的能力。大部分代码的问题,其实都是意识和见识带来的问题。
回到这个问题本身,性能的监控、评测和分析,我们通常要通过一定的工具来解决。
第一个常用的工具是 JMH,我们在第 26 篇里简单介绍了这个小工具的用法。JMH 可以用来测试一个接口、一段代码跑得有多快。特别是当我们面临两个选择,并且犹豫不决的时候,对比 JMH 的测试结果,就可以给我们提供一个大致准确的方向。
第二个常用的工具是性能回归测试。我们经常修改代码,修改后的代码性能有没有变坏?这是一个值得我们警惕的问题。我们可以通过自动化的性能回归测试,来检测修改有没有恶化代码的性能。就像普通的回归测试一样,性能回归测试也需要写测试代码。编写自动的回归测试代码就相当于我们制造了一个工具。从长远看,工具可以提升我们的工作效率。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《代码精进之路》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(4)

  • 浅吟且行的未来
    范老师好,我想问下为什么temporaryMap会被赋值两次,分别对应第4行和第8行。

    我的理解是:Java里非基本数据类型是引用传递,那helloWordsMap的更新会直接更新temporaryMap,所以我不理解为什么会赋值两次?

    作者回复: “引用传递”的理解可能误导了你。学习C语言和Java语言的时候,可以把赋值都看作值传递,然后去理解不同的类型传递的值到底是什么,也就是到底是什么值。

    比如,这个例子的helloWordsMap和temporaryMap的两个变量,其实它们的值都是指向一个map的地址。map的变化,并不会引起指向这个map的地址的变化。所以,才会有让人迷惑的“引用传递”的说法。但是,helloWordsMap和temporaryMap这两个指向map地址变量,是可以变化的。而且,它们的变化都是独立的,不传递的。

    第一次赋值,helloWordsMap和temporaryMap相同了,指向同一个地址。需要注意的是,但从变量本身看,helloWordsMap和temporaryMap是两个不同的变量,一个变量的变化,对另外一个变量没有影响。你可以仔细琢磨一下我说的值传递。

    第一次赋值后,helloWordsMap可能指向null地址,然后temporaryMap就也有可能指向null。同步时,需要检查helloWordsMap是不是还是指向null。如果helloWordsMap已经不指向null了,temporaryMap依然是指向null的,这时候,就要更新temporaryMap的指向地址。所以,需要第二次赋值。

    2019-05-19
    2
  • aaa
    延迟分配是指延迟同步嘛,还是不会同步,如果是延迟同步的话是什么时候才会同步

    作者回复: 延迟分配和同步是两个概念,分开理解更容易些。 关于延迟分配,参见地二十四讲。 如果非要放一起的话: 延迟分配,有的时候可以免除同步,有的时候降低同步,有的时候没什么影响。你看,和不放一起没什么两样。更多的具体的例子,请参考《Effective Java》。

    2019-04-16
    1
  • 空知
    helloWordsMap = temporaryMap; helloWordsMap 还是指向了temporaryMap,temporaryMap发生变化 helloWordsMap 还是要同步的吧?

    作者回复: 是的,这么复杂的延迟分配代码,要解决的就是helloWordsMap变化的同步问题。

    2019-03-13
    1
  • 往事随风,顺其自然
    怎么判断由voliate 修饰的变量是否会反复变化,来决定是否采用临时变量引用

    作者回复: 一般采用延迟分配方法的代码,都很简单,而且变量仅赋值一次。其他的场合,还要看具体的代码。 比如final修饰的变量,就不会反复变化。

    2019-03-13
收起评论
4
返回
顶部