Java多线程闲聊(一)

其实我对Java有较高的好感度已经是很久之前的事情, 因为Java是第一门让我感觉很有成就感的语言。想想那些青葱岁月,走出过去已经让我花了太多太多的时间,我想说的是,今后,我要努力让自己面向未来。

很遗憾,我不擅长记忆,因为很多时候,我的记忆被过去的悲伤所占据,我被困在名为不可名状的深邃所占据,在茫茫迷雾里摸索,在不见一切的幽暗海底里彷徨。我曾经以为人生仅仅是一场游戏,我曾经以为自己的人生毫无意义,我曾经尝试让自己沉沦,但是内心的倔强却将我连根拔起,让我不断地重新认识自己,让我认清自己的窘态。

说到多线程,首先还是会说到并行和并发,这两者的区别。并行是什么,并行是指两个以至更多的任务能够同时工作,是指一种状态,和我们平时说的一边干啥一边干啥其实差不多。但是并发却是描述一种处理事务的能力,往往和时间所绑定,我们编程的时候常常会以"高并发,低耦合"为目标,其实意思就是寄希望于我们的程序能够在单位的时间内,处理更多的事情。注意,并行能力强,其实并不意味着程序的性能强,因为如果强行将单线程能完美执行的程序硬生生分割成多线程程序,这反而会让代码变得更加复杂和低效,因为阅读复杂代码和线程切换本身都是成本。然而与之相对的,如果说一个程序是高并发的,那么这个程序就毋庸置疑是高效的,哪怕程序本身并没有用到多线程技术,Functional Proggraming技术里有一个Actor模型,就是典型的例子。

进程是操作系统里进行资源分配的最小单位,这点的确不错。那为什么不是线程呢?因为很有可能在进程诞生之初,并没有线程的概念,就像现在协程仅仅是一个概念,操作系统层面并没有对协程有着直接的支持。计算机的发展就是逐层封装的探索过程,就像冯诺依曼就自称计算机的助产士,而实际的思想其实都来源于图灵一样。每一个计算机的开发者其实都是站在前人的肩膀上,基于前人的思想,前人的经验,前人的成果来进一步开拓人类的新的边疆。这也是为什么一旦人们已经普遍接受了一件事物后,当新的同类事物出现时,除非有极大的改善,不然基本无法撼动前者的地位一样。所以,很多时候就算很多人拥有科学上网的方式,但是说起搜索,第一反应还是百度,因为遇到麻烦百度一下其实已经深入骨髓了。

Java多线程闲聊(一)

其中最为明显的就是计算机网络的协议架构了,基本上可以说,计算机网络的架构可以很完美地诠释到底什么是抽象,什么是分层,什么是依赖倒转,什么是单一职责等等这些设计模式里面耳熟能详的概念。毕竟人们的思想其实差异并不大,真正和你思想差异巨大的人,其实你根本上遇不到,不是被保护起来了,就是被关起来了。

Java多线程闲聊(一)

就拿RTMP协议来说吧,他在TCP协议建立起连接后,需要再在自己的实现层再通过握手等操作建立起专属于自己的连接,仅仅因为TCP协议建立起的连接信息不能完全满足自己的实际需要。像请求对象的时间戳啊,协议的版本啊,这些TCP协议连接并不能提供的数据信息。TCP协议建立之初,又不能预见未来,总不可能把一切能获取到的数据信息都传输出去吧。那样,每年需要多花多少钱用于传输这些多余的数据,而且仅仅是为了这个可能的,还不一定出现的未来的需求。大多数的事情为什么在逻辑上那么残酷,为什么所谓的追求情怀和良心往往让人敬佩,因为其实大多数的事情其实追根溯底都或多或少的和资本相关联,然而资本这东西,你懂的,从来不会和你讲所谓的人情味。要是和你讲人情味,那就不是资本了。在资本眼里,哪怕是人命,也是完全能够用金钱来衡量的,虽然为了堵住社会道德舆论的嘴,资本往往不捅破这一层罢了。

所以同理,如果我需要新创建一个线程,实际上还需要通过进程进行间接的资源申请和分配才行。原因就是上述的,抽象和分层逻辑。但是,毫无疑问,我绝不能放任进程肆意创建线程,因为线程本身的创建往往就需要分配资源,而且其实并不小,起码都有1M。这也是为什么Windows和Linux的操作系统对于线程数都存在着限制,Windows是2000个,Linux是1000个。好吧,我大概知道为什么Windows为什么常常会暴走了,毕竟一叶知秋,以小见大。

线程直接的合作分为协作式和抢占式,所谓协作式就是指线程之间相敬如冰,他们之间做的行为往往都会打好招呼,不会硬来,抢占式就相对蛮横。Java的程序天生就是一种协作式的多线程程序,在启动一个java程序时,出了main函数所运行的线程之外,同时会开启多个线程来为线程提供额外的价值,比如说,对于引用(类似于C里面指针)的监控和回收的线程啊,对于信号的监控和响应啊,等等。