finalize

想要去了解 finalize 的最初起因是想去了解下 java.lang.ref 下的三个 Reference 类。这三个类在实践中用的比较少,但却是面试中经常会问到的。[1] 在理解这个三个类时需要理解对象的可达性(reachable),可达对象就是所谓的强引用,也即程序中通常使用的引用。这种对象可以被任何活线程访问,这里的活线程指除了 finalizer 线程外的其它运行中的线程。当对象不再可达时,就成为了 GC 的候选对象。此时,如果对象定义了 finalize 方法,这个方法被称为 finalizer。GC 在回收实现了 finalize 方法的对象前会调用此方法,然后才是回收内存,这给实现此方法的对象提供了一个在被回收前来释放外部资源,具体可能是线程池、socket 连接、文件句柄等。[2]

但 finalize 方法是有问题的。首先,此方法的调用时机是未知的,意味着这些对象或资源可能会占用不确定的时间后才会被释放,这在 burst 时会是一个很严重的性能瓶颈。其

阅读全文 “finalize”

英语真的是好东西

自从读过了《C++ primer》的英文版之后,后面读的几乎所有计算机书籍都是英文原版的。这样之后我感觉不仅英文水平提高了不少,计算机的水平也提高了不少。翻译的书有不少地方词不达意,必须要看了原文才能明白语义。不少翻译书缺乏术语的英文,这样也没法在 Google 上搜索到对应的内容。Google 搜索英文关键词,往往可以得到大量实用经典的资料,是对 textbook 的很好补充。我读的英文原版全部都是电子版的,配合我的 DPT 的划线和笔记功能,一点都不比在纸质版上差,甚至是更好,而且阅读完了之后再放到网盘中,随时下载进行全文搜索。

去年,我还读了《普林斯顿微积分读本》的英文版,充分认识到了自然数 e 和无穷级数的威力,以及它们和微积分的关系。遇到不甚明白的地方,就到 wikipedia 上进行词条搜索,往往可以得到不少补充。这样下去,不仅英文水平会持续提升,学科上的水平也会不断提升。今后的方式依然会是阅读英文原版书,中文的书就只读中文作者写的。

最近开始系统去读一些知名

阅读全文 “英语真的是好东西”

skynet 中定时器的设计

距离上一次阅读 skynet 的源码已经有 4 年之久了,那是我第一次阅读如此优雅的代码,以至于我从 Java 直接转到了 skynet 开发。 前几个月有朋友问我如何实现 timer 的,我只简单的回答了下用了分级来实现的。 至于是如何分级的,我今天下午重新阅读了代码把思路整理了下。 说实话,通过看代码来推断设计思路远不如先看设计思路再阅读代码来的清晰。

首先需要说明的是 skynet 的时间精度是厘秒,即 1s = 100 cs。 以及下面会混用定时器引擎和添加进来的定时器任务,我都统称为定时器,请根据上下文进行分辨。 并且此文中队列和链表是一样的,链表是队列的具体实现方式。

0x01 数据结构定义

下面先解释 timer 的分级结构,然后再介绍如何添加定时器,以及定时器的 update 。

以下是 timer 的结构体:

#define TIME_NEAR_SHIFT 8
#define TIME_NEAR (1 << TIME_NEAR_SHIF

阅读全文 “skynet 中定时器的设计”

我对编程的想法

大半年没有写任何东西了,这段时间发生了很多事情,对编程的想法也在发生着改变。以前是怕编程,怀疑自己不是编程的那块料,毕竟我从来没有做出过任何值得称道的项目。内心深处因为大学没有扎扎实实学过任何一门编程的课,总有那么一个障碍。看到这些复杂的项目觉得自己肯定写不出来,也搞不定。

改变是从学习完 C++ 基本的内容开始的。在学习 C++ 之前,我觉得这个东西极其的神圣,学会了肯定就什么都会了,对于会 C++ 的人有一种发自内心的觉得不可超越。直到学习完之后才发现,这东西并不是不可为,并不是学不会。而且由于我极其认真地几乎将整本《C++ primer》都翻译成了中文,去掉了其中解释性的句子,只保留了最简单的描述以及复杂点的解释。说实话,C++ 语言的各种用法确实太多了,而且需要注意的坑也太多了,即便是这样学完了之后,如果要真的写点东西的话还是有非常多地方需要深思,免不了要多翻一下自己的笔记。

然而我已经知道 C++ 是怎么回事了。虽然肯定达不到精通的地步,但想要继续深入的话也是完

阅读全文 “我对编程的想法”

摆脱肤浅的学习

学习必然是一件苦差事,没有捷径可走,不要妄想在非常短的时间内有非常大的提升,学习必然是一点一点积累起来的,唯独勤奋可以达成目的。

想要达到专家水平需要非常长的时间,预计是十年,而且这十年的学习不是简单的重复而是刻意练习(deliberative practice)。刻意练习的关键在于:不仅仅是一遍遍重复去做,而是用刚好超出你当前水平的任务来挑战你自己,尝试它,在做的过程中和做完之后分析你自己的表现,然而修正错误。这样重复,然后再重复,直到生命的尽头。这其中并没有什么捷径。

真正的专业是需要一生的努力,想要在任何领域做的出色只能通过一辈子的劳作;没有更低的代价。在绝大多数领域即便是最有天赋的人也需要非常多的时间来达到最高水平的表现。

具体到编程领域

  • 对编程感兴趣,做这件事是因为乐趣,确保这件事足够有趣以至于我们愿意花10年的时间来做这件事;
  • 真正地去编程:学习最好的方式是做中学(learning by doing),只有精心设计的努力才能提供一个人的技能水平,最有效的

阅读全文 “摆脱肤浅的学习”