最近经常来看blog,却很少写。一来是因为搬家的事情烦躁了很久,无心打理博客。二来回顾了一下自己的blog,并且和优秀的人士作了一些对比,发现自己写的东西,走来走去,还是走不出那几行代码的圈子。 一叶障目。
最近一直在写一个java线程方面的ppt,期望在40页以内精炼出最合适的内容。TL要求修改再修改,提炼再提炼。ppt要更少的文字,更深层次的信息传递。
可是,关于java的线程,有哪些是最需要写的呢?
最近三年来我一直觉得线程就是使用wait,notify,知晓volitae,和Excutor, 熟悉各种lock。
但是修改了几个版本PPT之后,发现抄API文档真的有些俗套,于是换成了下面这些主题:
1.线程与进程。 不要告诉我线程是轻量级进程, 我需要说的是“进程间的通讯方式”(做c++的都清楚,但是做java的估计根本没考虑过),“进程创建和线程创建的效率对比数据”,以及操作系统对资源的分配原理。
2.“并发”的范畴也是一个重要的概念。通常我们理解的多线程仅仅是“互斥与锁”,却忽略了另外一个范畴“可见性”。 从现在开始,将并发理解为互斥+可见性, 是不是会对“并发”明白很多呢。
3.去回头审视那些隐蔽了n个月乃至n年的bug,举出一到两个实例,将错误总结到理论的层次。然后反推,为什么这么简单的理论,可以在代码里面潜伏n久?
当然上面这些东东,自己感觉层次还是不够,还需要继续修改。写出一份合格的PPT或者一篇不错的博客,都是需要无数次推翻自己,无数次的修改, 并且不断的拔高主题。
但是认识一个事物,恰恰相反,需要自顶而下。
曾经下过好几次决心去学java的NIO,每次看完API文档都是一头雾水,每次无功而返。
最近工作中实实在在的到接触到linux上的I/O模型,select和epoll模型,于是也就开始理解“多路复用”的妙处了。
从这个角度来讲,一次真正意义上的学习,一定要挖掘一下背景,并且清楚的知道这件事情存在的意义。 界定一次学习的成绩,不是熟练了API,而是能否将内容自下而上的归纳到起点。