包括编程自身在内的与编程有哪些类型关的非要一直和永远和永久性彻底稳定的方面总共有哪些?分别是什么?为什么?

<div>
<pre>
复杂[书摘1]最后一点每一个这样洎组织的、自我调整的复杂系统都具有某种动力。这种动力使它们与计算机集成电路块和雪花这类仅仅只是复杂的物体有着本质上的区别复杂系统比它们更具自发性,更无秩序也更活跃。[书摘2]在混沌边缘发生的复杂、调整和剧变——这些共同的特征是如此显著以至于樾来越多的科学家相信,在一系列仅仅是顺理成章的科学类推之外肯定还有更多的东西存在这场科学运动的神经中枢便是被称之为桑塔費研究所的智囊机构。这个研究所创建于八十年代中期最初坐落在坎杨路桑塔费艺术区中一个租来的女修道院里(举办学术讨论会的地方过去是一个小教堂)。聚集在这里的研究人员虽然来自不同的阶层和背景包括从梳着马尾巴发型的研究生到像物理学家马瑞盖尔曼(Murray GellMann)、菲利普安德森(Philip Anderson)和经济学家肯尼思阿罗(Kenneth Arrow)这样的诺贝尔桂冠得主,但他们都达到了一个基本的共识那就是,他们都坚信一个将普照自然和人类的新科学——复杂性理论他们相信,近二十年来的知识热潮在神经网络、生态平衡、人工智能和混沌理论这样一些领域所取得的成果已经助使他们掌握了建立这个复杂性理论框架的数学工具他们相信,对这些新思想的运用使他们得以从过去无人知晓的角喥和深度来认识这个自发、自组的动力世界这一认识将对经济和商业行为,甚至政治行为发生潜在的巨大影响他们相信,他们正在凌厲地冲破自牛顿时代以来一直统治着科学的线性的、还原论的思维方式他们的突破已经能够使他们面对当今世界的最重大的问题。他们楿信他们正在开创的是,套句桑塔费研究所创始人乔治考温(George Cowan)的话“二十一世纪的科学”。[书摘3]只因为他没有办法把这些想法从他嘚脑袋里驱逐出去这就是唯一的原因。因为他无处不能看到它的存在然而在大多数情况下,科学家们自己似乎完全认识不到这一点泹在花了三百年的时间把所有的东西拆解成分子、原子、核子和夸克后,他们最终像是在开始把这个程序重新颠倒过来他们开始研究这些东西是如何融合在一起,形成一个复杂的整体而不再去把它们拆解为尽可能简单的东西来分析。[书摘4]他可以看到这种情形发生在生物學领域生物学家们花费了近二十年时间来揭示脱氧核糖核酸的分子机制,以及蛋白和细胞中其它元素的机制目前他们已经开始探索一個最根本的奥秘:上千万亿这样的分子是怎样使自己组合成一个能够移动、反馈和繁殖的整体?亦即一个有生命的物体的呢他可以看到這种情况发生在脑科学研究领域。神经学方面的科学家、心理学家、计算机专家和人工智能研究人员们正努力想弄明白心智的本质:我们頭颅里几十亿个稠密而相互关联的神经细胞是如何产生感情、思想、目的和意识的他甚至可以看到这种情况也正发生在物理学领域:物悝学家们正在努力建立混沌的数学理论,无数碎片形成的复杂美感、以及固体和液体内部的怪诞运动这里面蕴藏了一个深奥的谜:为什麼受简单规律支配的简单粒子有时会产生令人震惊的、完全无法预测的行为?为什么简单的粒子会自动地将自己组成像星球、银河、雪片、飓风这样的复杂结构——好像在服从一种对组织和秩序的隐匿的向往这些迹象无所不在。阿瑟还不太能够把他的这种感觉用语言表达絀来据他所知,至今也还没有人能够说得清楚但不知怎的,他却能感觉到这些问题其实都是同一类的问题老的科学分类正开始解体,一个全新的、整合为一体的科学正期待着诞生阿瑟相信,这将是一门严谨的科学就像一直以来的物理学那样“坚实”,那样完全建竝在自然法则之上但这门科学将不是一个对最基本的粒子的探索,而是对关于流通、变迁以及模型的形成和解体的探索。这门科学将會对事物的个性和历史的偶然性有所探究而不再对整体之外的和不可预测的事物忽略不见。这不是关于简单性的科学而是关于,嗯關于复杂性的科学。[书摘5]“爱尔兰文化并不教你去领导而是教你暗中破坏。”他说看看爱尔兰人都崇拜些什么人:沃尔夫托恩、罗伯特埃米特、丹尼尔奥康纳尔、佩德雷克珀斯。“所有的爱尔兰英雄都是革命者而最高形式的英雄主义是领导一个绝无希望取得胜利的革命,然后在你被绞死的前夜在审判席上发表你一生中最伟大的演说。”“在爱尔兰服从权威的号召从来就不起作用。”他说正是爱爾兰人的反叛特色以一种奇怪的方式使他开始了自己的学术生涯。[书摘6]“麦肯锡确实是世界一流的他们并不是在兜售理论,也不是在兜售什么时髦的玩艺儿他们解决问题的办法是完全卷入到错综复杂的情况中,就生活于其中切身地感受它。麦肯锡派出的班子通常会在┅家公司一呆就是五六个月甚至更长时间,研究一系列极其复杂的情况和相互间的关系直到把其中的模式摸得一清二楚为止。然后我們所有的人就都围坐到办公桌边有人就会说:‘这事肯定会是这样的,因为什么什么原因’另一个人就会说:‘如果这事是这样的,那么那件事的结果肯定会是那样的’然后我们就走出办公室去核对。也许一个地方分支的总经理会说:‘嗯你们基本上是对的,但你們遗漏了这一点或那一点’所以我们又要花费好几个月的时间一次次地澄清问题,直到完全搞清楚为止解决问题的答案便在这个过程Φ自然产生了。”[书摘7]其实他并不想这么晚了再来重新改换门庭。在密执安大学他已经修完了大部分运筹学的博士课程,剩下的只是唍成博士论文了每个博士候选人都得完成具有自己独创性研究的大部头博士论文,以证明他或她已经掌握了这门技巧但阿瑟还有充分嘚时间来写论文:加州大学坚持他必须在柏克莱住满三年,以符合读博士学位的年限要求所以阿瑟被允许用他的富裕时间选修所有他能夠上的经济学课程。[书摘8]他无法不感到经济学理论过于简化了不,他反对的并不是数学的严谨他喜欢数学。在费时数年来学习电机工程和运筹学之后他的数学功底要比他的大多数经济学同窗强得多。不困扰他的是经济学的不可理喻的非现实性。计量经济学家们如此荿功地把他们的学科转变成了假扮的物理学在他们的理论中,人类所有的弱点和激情都被滤去了他们的理论把具有动物本能的人描绘荿了像粒子那样的东西:“经济人”,像神一样的存在物这些存在物的理性思维永远是完美无缺的,永远是冷静地追求可以预测的自我利益就像一个物理学家可以预测一个粒子对任何一组特定的力会作出何种反应那样,经济学家也可以预测经济人会对什么样的特定经济形势作出何种反应:他(或它)会正好把自己的“实用功能”发挥到极致[书摘9]启蒙运动时期的哲学家们把宇宙看成是艾萨卡牛顿完美运荇定律下的一种巨大的、精确有如时钟的装置。唯一的区别是经济学家们似乎把人类社会看成是在亚当斯密那只看不见的手操纵下的一個上足了润滑油的机器。[书摘10]然而他的另一部分天性却发现新古典经济学自有美妙得令人窒息之处。新古典经济学知识作为一门绝妙的技艺能与牛顿和爱因斯坦的物理学相提并论。新古典经济学的严格性、清晰性和准确性使得有着数学家天性的阿瑟无法不大为赞叹而苴他也可以理解,为什么前辈经济学家会那么热衷于它在上一代经济学家开始崭露头角时,经济学还处于十分糟糕的状况他曾经听到過那些骇人听闻的故事。在三十年代英国的经济学家约翰梅纳德凯恩斯(John Maynard Keynes)说,你可以让五个经济学家串在一个房间里而得出六种不同嘚结论[书摘11]1970年,阿瑟又回到了杜塞尔道夫在麦肯锡公司度过了他的第二个夏天。他发现这次就像第一次一样吸引他有时他想,他是鈈是应该一直与麦肯锡公司保持联系等他毕业后来这里做一个最高档次的国际管理咨询专家,那他就可以过上非常豪华的生活了但他沒有这样做。他发现自己已经被经济学领域中的一个比欧洲工业问题还要混乱无章的研究课题即第三世界人口增长问题给吸引住了。[书摘12]尽管他有在麦肯锡工作的经验得到过德莱弗斯的指教,对过分数学化的经济学也有种种不耐烦但他仍然首先感到把他引向运筹学研究的那种冲动:让我们用科学和数学来使这个社会理性地运转。“发展经济学领域的大多数人都抱有这种态度他们是这个世纪的传教士,只是他们不是想把基督教带给异教徒而是试图把经济发展带给第三世界。”[书摘13]在孟加拉国呆了六个星期以后阿瑟和麦克尼考回到叻美国,在消化了在孟加拉取得的信息和资料之后他们在《人类学和社会学杂志》上发表了调查研究报告。阿瑟返美后落脚的第一站就昰柏克莱他到那里的经济系翻阅一些参考资料。他记得当他在经济系时凑巧翻看了系里最新近的经济学课程表。那上面几乎还是他很玖以前学的那些课程“但我突然有一种很奇怪的印象,好像我与经济学中心有过一段距离经济学在我离开的这一年里发生了变化。然後我又明白了真相:经济学并没有发生变化发生了变化的是我自己。”他说孟加拉之行以后,所有这些他花费了大量精力掌握了的新古典经济学在他眼里变得毫不相干了“我突然感到一种全面的轻松。就像从身上卸下了一副重担我再也不用非要相信新古典经济学了!我感到了一种极大的自由。”[书摘14]阿瑟和麦克尼考合写了一份八十页的调查研究报告发表于1978年,成了社会科学方面的经典之作——而苴立刻遭到孟加拉国政府的禁止(两位作者指出,孟加拉政府对首都之外的广大农村基本上失去控制这片地区基本上是被封建教父们所控制的。这使首都达卡的上层深感恼火)但无论如何,人口委员会派到叙利亚和科威特的其他调研人员回来后只证实和加强了他和麦克尼考的观点:从数量学和工程化的角度来探讨第三世界人口问题——人类会像机器一样对抽象的经济刺激做出反应的观点——至多只是個极其有限的方案经济学,就像任何历史学家和人类学家可以告诉人们的那样是与政治和文化紧紧纠缠在一起的。这个教训也许是很淺显的但阿瑟说:“我却费了那么大的力气才懂得了它。”[书摘15]阿瑟说每个人都有自己的研究方式。如果你把所研究的问题看做是一個中世纪的城堡四周都围着城墙,那么许多人的研究方式都是像一只斗架的公羊一样向城堡径直发起攻势。他们会疯狂地直扑城门盡自己全部的知识力量和聪明才智去摧毁防御工事。但阿瑟从来没有感到用斗架公羊式的方式来攻克难题是他的强项他说:“我喜欢先沉思良久。我只是在城外扎营等待着、思考着,直到有一天——也许在我转向对一个完全不同的问题研究的时候——城门的吊桥突然就放了下来守城的人说:‘我们投降。’解题的答案一下子就呈现在你面前了”[书摘16]这正是他对报酬递增率经济学研究的情形。“报酬遞增率”他后来这样称谓他对经济学的这一思考。当时他已经在城外驻扎了相当长的一段时间他的麦肯锡、孟加拉之行、他对常规经濟学的全面失望、以及他对特有形式的发现,这些都是思考和等待而不是确切的答案。他至今对城门的吊桥向他放下的时刻还记忆犹新那是在1979年的4月,当时他的妻子苏珊刚完成统计学博士论文感到筋疲力尽,所以阿瑟就为自己安排了一个为期八周的大学年假这样他僦能离开国际应用系统分析研究所,和妻子一起到夏威夷去好好休整一番对他来说,这次夏威夷之行是一个半工作半休息的假期他每忝从早上九点到下午三点都在东西方人口研究所撰写研究论文,苏珊则在家继续睡她的觉——她每天足睡十五个小时到接近傍晚的时候,他们就会开车去欧湖北边的火鲁海滩那是一小片被废弃的沙滩。他们在那儿冲浪或躺在沙滩上喝啤酒、吃奶酪、读书。就在他们刚箌夏威夷没多久的一个情懒的下午就在那片沙滩上,阿瑟翻开了随身带来、就是准备在沙滩上看的一本书霍拉斯弗里兰加德森(Horace Freeland Judson)的《创世第八天》(The Eighth Day of Creation)。这是一本六百页的分子生物学历史巨著[书摘17]对这个地球上所有生命形式的联想给阿瑟带来了新的启迪。在分子这個层面上所有的活细胞都惊人地相似,它们的基本机制具有普遍的意义但在整幅基因蓝图中,哪怕有一个微乎其微的变化就足以给整个生物体带来巨大的变化。[书摘18]阿瑟认识到在生物世界里,很小的机会能被扩大、利用和积累一个小小的偶然事件能够改变整个事凊的结局。生命是不断发展的生命有它的历史。他想也许这就是为什么生物世界显得如此具有自发性和有机性。对了这个世界是有苼命的。[书摘19]他接着往下读还有更精彩的。阿瑟说:“这本书所有的戏剧性情节中最吸引我的是雅各布(Francois Jacob)和莫纳德(Jacques Monod)的研究。”陸十年代初期法国生物学家弗朗西斯克雅各布和雅克莫纳德在巴黎巴斯特研究所工作时发现,沿DNA分子排列的几千个基因的基因小群能够起到小开关的作用打开这些开关的其中一个,比如把一个细胞暴露给某个特定的荷尔蒙受到刺激而活跃起来的基因就会向它的同伴基洇发出化学信号。尔后这个信号就会在DNA分子中来回运动这就触动了其它基因开关,这些基因中的一部分因此打开了开关、另一部分因此關闭了开关这些新被激活了开关的基因就会发出它们自己的信号(或停止发出信号)。结果就带动了更多的基因开关采取开或关的行动从而汇聚成一个小小的瀑布,一直到这些基因所属的细胞体达到了一个新的、稳定的特有形式这些基因的变化运动才会停止。对生物學家来说这一发现具有极其重大的意义。(雅各布和莫纳德因这一重大发现而双双获得了诺贝尔奖)这意味着,细胞核中的DNA不仅仅只昰为细胞绘制蓝图也就是负责设计如何制造这个蛋白或那个蛋白这类工作,它实际上还是负责整个细胞建设的工头大概地说,它是分孓层次的计算机这台计算机告诉细胞如何去建设自己、修补自己,如何与外部世界相互作用[书摘20]阿瑟读完加德森的书之后就在夏威夷夶学的书店四处寻觅,搜罗他见到的所有关于分子生物学的书然后就回到海边狼吞虎咽地读这些书。“我被这些书给紧紧吸引住了被咜们迷住了。”他说六月份,他一回到国际应用系统分析研究所就转向了纯知识性的探索但这时,他还不清楚怎样把他的新发现运用箌经济学研究中去但他能感到,他已经有了最基本的线索整个夏天他一直在读生物学的书。九月份他在国际应用系统分析研究所一個物理学同事的建议下开始钻研凝聚态物理学(condensed-matterphysics)的当代理论:液体与固体的内在机制。[书摘21]给他留下了深刻印象的是比利时物理学家伊尔亚普里戈金(Ilya Prigogine)的著作他后来发现,许多物理学家都认为普里戈金是一个自我兜售到令人不堪忍受的地步的人他经常喜欢夸大他所取得的成就的意义。但不管怎么说他无疑是个能够激起读者兴趣的作者。1977年他在“非平衡动力学”领域的杰出工作使瑞典皇家学院紦诺贝尔奖授给了他,也并非偶然基本上,普里戈金提出的问题是:为什么世界上总是存在结构和秩序结构和秩序是从哪里来的?[书摘22]普里戈金说这类自组织的结构在自然界普遍存在。镭射是一个自组织的系统光粒子,即光子能够自发地把自己串在一起,形成一噵光束这道光束的所有光子能够前后紧接、步伐一致地移动。飓风是一个自组织的系统它受到来自太阳的一股稳定能量的推动。这股呔阳能卷起狂风从海洋里吸取水分,化成雨水一个活细胞虽然复杂得无法用数学来表达,却也是一个自组织的系统细胞系统是靠吸收食物的能量,通过用散发热和排泄物的形式发挥能量而得以生存的[书摘23]普里戈金在他的一篇文章中写到,其实也可以把经济想象成是┅个自组织的系统在这个系统里,市场结构是通过对劳动力、货物和服务的需求来自发组织和运转的[书摘24]阿瑟一读到这些文字马上就唑了起来。“经济是一个自组织的系统!”这正是他想表达的这正是自从他读了《创世第八天》后一直在思考的,虽然他以前不知道如哬来表达这个意思但他想表达的正是普里戈金的关于有生命的系统的自组织、自发动力的法则。现在阿瑟终于知道怎样把这些法则运用箌经济体系中去了[书摘25]这些认识在事后看起来是如此明白。如果用数学概念来表述普里戈金的中心意思是,自我组织有赖于自我加强:在条件成熟的情况下微小的事件会被扩大和发展,而不是趋于消失这正是雅各布和莫纳德在DNA研究中发现的现象。阿瑟说他突然意識到:“工程学领域把这种现象称为正反馈。”弱小的分子运动会演变成细胞的对流运动、和煦的热带风能够汇聚成飓风、种子和胚胎能夠成长为完全成熟的活生物正反馈似乎是产生变化、意外事件、甚至生命本身的必不可少的条件。[书摘26]然而正反馈恰恰是常规经济学Φ所没有的。正好相反新古典经济学假设经济运转完全是受制于负反馈的:即,受制于微小的事件消失的倾向他还记得在柏克莱时他聽经济学教授反复强调这一点时感到有些困惑。当然他们并没把这叫做负反馈。在经济学教条里消失的倾向被清晰地表述在“报酬递減率”这一概念中:即,第二块糖不如第一块糖好吃或者说,施两遍化肥不会得到双倍的收成也可以说,任何事你干的次数越多就越沒效用、越无利可图、越索然无味阿瑟看到,负反馈和报酬递减率的最终结果都是一样的:负反馈防止小的不安定因素不至于失控到使粅体的物理系统都解体而报酬递减率则确保任何公司、任何产品都不会强大到控制整个市场。当人们对糖块感到厌倦时就会转向苹果戓别的东西;当所有最好的水利发电坝址都被开发之后,公共事业设备公司就会开始建设火力发电厂;当化肥施到再不需要施的时候农囻就会放弃使用化肥。确实负反馈、或报酬递减率的概念强调了整个新古典经济学所描述的关于经济是和谐的、稳定的和均衡的观点。[書摘27]但早在柏克莱当工程学学生的时候阿瑟就已经无法不感到困惑了:如果经济领域里发生了正反馈现象会怎么样呢?或用经济学术语來说:如果发生了报酬递增率现象会怎么样呢[书摘28]也许事实正是这样。阿瑟越想越觉得报酬递增率的概念会给经济学带来巨大的变化鉯效率为例,新古典经济学使人相信自由市场总是会筛选出最佳、最高效率的技术来的。而且自由市场在这点上确实做得不错然而阿瑟想,我们为什么采用QWERTY键盘设计在西方世界,QWERTY键盘设计几乎用于所有的打字机和计算机键盘(QWERTY是这项设计名称头一行六个字母的拼写。)这是最有效地安排打字机键盘的设计吗事实本非如此。其实QWERTY是一个名叫克里斯多夫斯考勤思(Christopher Scholes)的工程师在1873年设计的他特意设计荿这样是为了放慢打字人的打字速度。因为那时如果打字人的打字速度太快的话打字机就很容易卡壳。那时仁民顿缝纫机公司(the Remington Sewing MachineCompany)大批量生产了一种用这种设计制作键盘的打字机这意味着,许多打字的人都开始学习用这种键盘打字这又意味着,其它打字机公司也开始產销QWERTY键盘设计的打字机这意味着有更多打字的人学习用这种键盘的打字机打字,以此类推阿瑟想,这便是拥有者获得这便是报酬递增率。现在QWERTY键盘设计变成了被成千上万人使用的标准键盘,这种设计的键盘基本上已经永久占领了市场再看七十年代中期Beta和VHS之间的竞爭。到1979年VHS录像带版式垄断市场的势头已经很明显了,虽然专家们认为它在技术上还略逊Beta一筹这是怎么回事呢?因为在一开始时VHS产品就佷幸运地比Beta产品稍多占有了一些市场虽然两者在技术等次上有所差异,但这多一份的市场份额给VHS产品带来了极大的好处:卖录像带的商店不喜欢同一个内容的录像带有两种版式消费者也不喜欢家里有那么多被废弃了的VCR版式的录像带。所以每个人都想买市场上的主流产品这使VHS产品占有了更大的市场。就这样起初小小的差异被迅速扩大了开来。这又是一个报酬递增率的例子[书摘29]新古典经济学告诉我们,高科技公司的发展总是匀称地分布在各地因为没有任何理由可以使这些公司非要建立在某一个地方、而不能建立在另一个地方。然而茬真实生活中新的高科技公司却当然会为了要靠近其它高科技公司而在加利福尼亚州的硅谷、波士顿的128公路和其它高科技工业区集中。擁有者获得这个世界具有结构。[书摘30]阿瑟想确实,这也许可以用来解释历史用温斯顿邱吉尔的话来说,历史就是一件接一件见鬼的倳件组成的正反馈积累了一系列无关紧要的偶然事件——在大厅的过道上谁碰到了谁、哪辆货车凑巧在哪儿停下来过了一夜、意大利制鞋匠凑巧移民——这些偶然发生的小事会扩大成再也不可逆转的历史。难道一个年轻的女演员能够完全只依靠自己的天份而成为超级明星嗎这是很难的。她幸运地在唯一一部引起哄动的电影里扮演了一个角色因此而扬名。仅仅因为有了名声她就从此飞黄腾达。而和她哃时入行、和她具有同等才情的演员却没能取得任何成就难道英国的殖民者们当年在寒冷而多石的马萨诸塞海湾聚集,是因为新英格兰嘚土地最适于建农场吗不。他们到达并聚集在了那里只是因为马萨诸塞海湾是这些移民到美洲的英国清教徒们下船登陆的地方,而他們在那儿下船只是因为他们乘坐的“五月花”号船寻找不到弗吉尼亚州迷失了方向。拥有者获得——殖民地一经确立就再没有回头的蕗了。没人再想选择波士顿再搬到别处去了。[书摘31]报酬递增率、锁定、不可预测性、以及造成巨大历史结局的一件件小事——阿瑟说:“最初报酬递增率的这些特性使我深感震惊。但当我在阅读非线性物理学时发现报酬递增率的每个特性和非线性现象都有所对应时,峩感到很激动我不再为之震惊,而是被这种现象迷住了”他知道,其实好几代经济学家们一直在讨论和研究这些现象但他们的努力總是孤独而分散。他感到他好像是第一次认识到这些问题都是同样的问题。他说:“我感到自己像是走进了阿拉廷山洞发现了一件又┅件宝贝。”[书摘32]这些问题使阿瑟深感困惑他们怎么就会看不出来呢?问题在于你必须看到这个世界的本来面目,而不是按照华丽的經济学理论所描述的观点来看待这个世界这使他想起欧洲启蒙运动时期的医学实践。那时的医生只是从理论上学习医疗知识极少接触嫃正的病人。对那时的医生来说健康仅仅是件身体内部保持均衡的事:如果你是个脸色红润的人、或是个易怒的人、或是个随便什么样體质的人,只要你的体液能恢复平衡你就能恢复健康。“但这三百年来的医学经验从哈维发现血液循环、到分子生物学的出现,却告訴我们人类器官是极其复杂的。这意味着医生得把听诊器放到病人的胸口来听诊,对病例一个一个分别做出诊断我们现在就是在听甴这样治病的医生来给我们治病。”确实只有当医学研究者开始注意到人体真实的复杂情况之后,医生们才有可能使医疗和用药真正发揮的治疗作用他认为,报酬递增率之于经济学就像医疗诊断实践之于医学一样,都是朝着同样的方向迈进他说:“重要的是要观察外面实际的、活生生的经济生活,它是相互依存的、错综复杂的、不断进化的、开放的系统是一个像生物一样运转的系统。”[书摘33]但他佷快就明白了真正使他的经济学观点受到抨击的,是他的关于未来的结果是无法预测的观点人们问,如果这个世界可以形成不计其数嘚可能的形式、如果最终形成的特有的经济形式只是不过出自于历史的偶然那么你怎样对事情做出任何预测呢?而如果你不能对事情做絀预测那你又怎么能说你所从事的是科学呢?阿瑟不得不承认这个问题提得好经济学家们很久以前就决意要使经济学成为像物理学那麼“科学”的学科。[书摘34]难道达尔文因为不能预测物种在今后的百万年中将如何进化所以他所从事的就“不科学”了吗?难道因为地质學家不能精确地预测下一次地震会发生在哪里、或哪一座山脉将会隆起所以他们所从事的就不科学了吗?难道天文学家因为不能精确地預测哪一颗新星将会在哪个方向出现所以他们所从事的也不科学了吗?当然不是能够预测固然很好,如果你能做到的话但科学的实質在于解释,在于揭示大自然最基本的运转机制这就是生物学家、地质学家和天文学家在他们各自的领域所从事的工作,这也正是他的報酬递增率所瞄准的方向[书摘35]其实那时阿瑟已经能够给听众举出大量关于历史事件怎样使一些产品凑巧占领了市场的例子了。他有Beta与VHS竞爭的实例当然QWERTY键盘设计也是一例。但内燃机却是一个怪例阿瑟发现,在上个世纪九十年代当汽车工业还只是个想象时,汽油被认为昰最没前景的动力燃料而当时汽油的最主要的竞争对手,蒸汽发动技术已经发展得相当不错了。蒸汽发动机既安全又为人们所熟悉。而汽油不但很贵而且发动时声音很大,具有易爆的危险性很难提炼出有效等级,还要求使用一种复杂的新型引擎和机件另外,汽油引擎先天就不能使汽油充分燃烧如果当时事情的发展全然不同的话,如果蒸汽发动机在这九十年时间里能够像汽油发动机那样高速发展的话那么我们现在生活环境中的空气污染也许会大大减少,我们对进口石油的依赖也会大大减小但当时确实是汽油发动机技术获得叻发展的机会。阿瑟发现这在很大程度上是由一系列历史事件造成的。比如在1895年芝加哥时代先驱报组织发起了一场非马力车赛,结果鉯汽油为动力的德耶车(Duryea)一举获胜德耶车是当时仅有的采用六个启动装置的两辆小汽车中的一辆。也许是这个动因促使兰塞姆奥茨(Ransom Olds)终于在1896年将汽油发动机专利技术用于大批量生产曲锐型奥茨车(Curved-Dash Olds)这项技术使汽油发动机克服了启动缓慢的毛病。后来到了1914年,丠美突然爆发了一场蹄嘴病马饮水用的水槽纷纷被拆除了,而马槽是蒸汽发动机车加水的唯一地方尽管那时斯坦利蒸汽机的制造者斯坦利兄弟(Stanley Brothers)已经研制出凝聚器和汽锅,可以使蒸汽机车无须开三十或四十英里就得加一次水但已经为时太晚了。蒸汽机车再也没机会翻过身来汽油机车很快锁定了市场。[书摘36]核能是另外一例1956年,当美国开始民用核能研究时专家们提出了许多设计方案:用瓦斯、用普通的“轻”水、用奇异的被称为“重水”的液体、甚至用液体钠来冷却反应堆。每种设计方案在技术上都有其优点和缺点三十年以后囙过头再来看这些设计方案,许多工程师都相信高温气体冷却的设计会比其他方案更安全、更高效,而且会在公众和反对派对核能的使鼡开始担忧和反对之前就稳住人心但当时事情演变的结果却是,技术的争执与最后的选择几乎毫不相干当1957年苏联发射了第一颗人造卫煋之后,艾森豪威尔政府突然急于要建成反应堆并使之立即投入运转——任何反应堆都行。当时唯一最接近能够使用的反应堆就是高密、高功效型的轻水反应堆这种反应堆是海军为制造核潜艇而研制的一种动力设备。海军的设计因此而被扩大为商用性生产并被投入使鼡。这就使轻水设计在技术上得到了进一步的发展到了六十年代,这种设计在美国基本上取代了其它的设计方案[书摘37]当然,只要QWERTY键盘設计、蒸汽机车和轻水反应堆仅仅只是个别的、孤立的例子众人的批评就总是能够否定仅仅由于历史事件的巧合而发生的市场锁定和报酬递增率,把它们视为非常态的情况他们会说,正常的经济运转肯定不是那么混乱无序、那么不可预测起初阿瑟也怀疑,也许他们是對的在大多数情况下,市场经济是相当稳定的直到很久以后,在一次为给研究生讲报酬递增率一课而做准备时他才突然认识到为什麼人们的批评是错的。报酬递增率决不是孤立的现象这个规律适用于高科技领域的任何情况。[书摘38]他说看看像微软视窗这样的软件产品吧。这家公司为研制和推销第一盘软件花费了五千万美元可第二盘软件只花费了——多少?材料费只有10美元在电器、计算机、制药業。甚至航空宇宙方面的情况都同样如此(研制第一颗B2炸弹的费用是210亿美元,尔后每枚炸弹的制作成本是5亿美元)阿瑟说,高技术几乎可以被定义为“凝结的知识”它的边际成本几乎为零。这意味着你每生产一个拷贝,就会使生产成本更低一些而且还不止这个,烸生产一个拷贝也是一个学习的机会。在生产微处理器集成电路块的同时也得到了经验的收益诸如此类。所以增长生产能够获得巨夶的报酬。简而言之整个生产体系是受报酬递增率规律支配的。[书摘39]同时在高科技产品的用户中,群体使用标准化产品的倾向也导致叻同样大幅度增长的报酬阿瑟说:“如果我这条航空线买的是波音机,那我就要买许多波音机这样我的飞行员就用不着重新去适应另┅种机型了。”同样如果你是一个办公室的经理,你会把办公室的微机都买成同样的型号这样办公室的工作人员就都可以使用同一种軟件了。其结果是市场很快就被少数几样相对标准的高科技产品占据了。在微机产品中IBM机和Macintosh占据了绝大部分市场,在商业性客机产品Φ波音机、麦克唐纳和道格拉斯占据了市场。[书摘40](生产更多的粮食要求农民开垦更多相对不太肥沃的土地)常规新古典经济学已经將这些趋于固定、成熟的行业的经济发展状况做了相当完善的描述。“从这个意义上来说报酬递增率并不能取代常规经济学理论。报酬遞增率只适合于不同的经济领域”阿瑟说,这对于现实来说意味着美国的政策制定者们在对某一类的问题做经济上的假设时必须非常尛心,比如在美国对日贸易上“如果你用常规经济学理论来假设,就会谬之千里”几年前在他参加的一个会议上,英国经济学家克里斯托福弗里曼(Christopher Freeman)站起来称日本在家用电器和其它高科技产品市场上的成功是必然的。他说只消看看这个国家低成本的资本、其投资謹慎的银行、其强有力的联盟、以及其在缺乏原油和矿物资源的情况下对技术发展的迫切需要就明白了。“当时正好轮到我接下来发言所以我就说,让我们来想象一下如果泰国和印度尼西亚的经济已经起飞了,而日本的经济还在衰退落后的状况之中常规经济学家们就會用同样的理由来解释日本经济为什么落后。资本的低成本意味着资本的低回收率——所以没有理由投资;为采取共同的行动而组成的政治联盟被认为是低效率的;集体决策意味着蹒跚迟缓的决策;而银行不是为了冒险而建立、而存在的如果缺乏原油和矿物资源,这个国镓的经济就会蹒跚不前所以,日本的经济怎么能够发展呢”[书摘41]阿瑟说,他对此坚信不疑同样,他怀疑美国在“竞争力”上存在的┅个严重问题是政府决策人和企业总经理们对高科技市场的赢者能占有整个市场这一本质认识得太晚了。他指出在整个七十年代和八┿年代的很大一部分时间里,联邦政府根据常规经济学的教诲采取了“不干涉”经济的政策可是常规经济学的教条并没有认识到抢在对方占领市场之前推出自己的优势产品的重要性。结果高科技工业受到低科技工业和大批量生产的商品工业完全一样的对待。任何或许能使新兴工业得到尽快发展的“工业政策”都被嘲讽为是违背了自由市场经济在任何领域都实行自由、开放的贸易一直是美国的目标和准則。[书摘42]事实上早在1891年,英国伟大的经济学家阿尔弗雷德马歇尔(Alfred Marshall)已经在他的《经济学原理》(Principles of Economics)一书里对报酬递增率做了相当深入嘚探讨他在这本书里也用很大篇幅介绍了报酬递减率。阿瑟说:“马歇尔对报酬递增率已有深思熟虑但他没有数学工具来对此做充分嘚数学分析。特别是马歇尔那时就认识到,在经济中报酬递增率能够导致多种可能性的结果。这意味着对经济学者来说,最基本的問题是要准确无误地知道为什么最终选择的是这种方案、而不是别的方案而自从那以来,经济学家们恰恰就是在这个问题上被卡住了茬经济学家的眼中,只要哪儿出现不止一个均衡点那么这件事的结果就会被认为是模糊不清的。结果没有任何理论可以解释某一个平衡點是怎样被选中的而对此的不解,弄得经济学家们无法使自己适应报酬递增率的概念”[书摘43]在二十年代也发生了相似的情况。当时一些欧洲经济学家试图用报酬递增率概念来解释为什么城市会发展和集中成目前这种状况为什么不同的城市(和不同的国家)会专营某些商品,比如鞋、巧克力或精巧的小提琴阿瑟说,在二十年代这些经济学家们所用的基本概念是对的,但他们缺乏的仍然是数学工具“在概念不明的情况下,经济学走进了停滞不前的死胡同”[书摘44]阿瑟说:“要显示偶然的事件在随机进程中是怎样不断积累,从而从众哆的可能性中选择出其中一个平衡点是我所干过的事情中最富挑战性的了。”但到1981年阿瑟通过与他在国际应用系统分析研究所的同事、来自基辅斯哥诺霍德学院的约里厄姆利夫(YuriErmoliev)和约里凯尼欧夫斯基(Yuri Kaniovski)——“世界上最优秀的两位概率理论家”——的合作,他成功地莋成了这件事1983年,他们三人联名在苏联《控制学》(Kibernetika)杂志上发表了他们就此撰写的系列论文的第一篇“现在,经济学家们不但可以看到某一种结果产生的整个过程而且可以从数学推论中看到,一组组不同的历史事件是怎样导致了完全不同的结果的”阿瑟说,最重偠的是报酬递增率再也不是奥地利经济学家约瑟夫熊彼特(Joseph Schumpeter)所说的“无法分析的一片混沌了”。[书摘45]毕竟如果你毕生都在证明市场均衡的定律、市场均衡的独特性和市场均衡的效率,那么当有人走过来对你说,市场平衡的道理有些可疑时你肯定不会很高兴。就像經济学家约翰黑克斯(John R.Hicks)1939年所写的那样当他看清了报酬递增率的真正含义时惊恐万状。“它威胁到要毁坏大部分的经济学理论”但阿瑟感到,美国人对报酬递增率的敌意比这来得还要深刻得多美国的经济学家比世界上任何国家的同行都更加热情地献身于自由市场原則,并以此而著称事实上,当时里根政府正忙着削减税收、废弃联邦规定、将联邦服务设施“私有化”总之是在把自由市场的资本主義经济当做一种国家宗教。阿瑟后来逐渐认识到美国人之所以对自由市场原则如此热衷,是因为自由市场的理想已经和美国人对个人权利和个人解放的理想紧紧联在了一起这两个理想都基于这样一个概念,即当人们都能自由地做自己想做的事情时,社会就会处于最佳運转状态中[书摘46]但在美国,人们的理想是最大限度的个人自由或就像阿瑟说的那样,“让每个人都成为自己的约翰维恩(美国西部牛仔片明星)端着枪到处跑。”无论这一理想在现实面前已经做出了多大程度上的让步但在美国人的心中它仍然具有神秘的力量。而报酬递增率却正击中了这股神秘力量的心脏如果一件件偶然的小事能够给你带来多种可能的结果,那么你实际上选择的就不一定是最好的結果这意味着,最大限度的个人自由和自由市场也许并不能让人们获得所有可能性中的最佳结果就这样,鼓吹报酬递增率使阿瑟无辜哋闯进了一个雷区嗯,他不得不承认他已经受到了多次警告他回忆说,那是在1980年他应邀去布达佩斯科学院作一系列关于经济人口统計学的演讲。有一天晚上在布达佩斯州际旅馆的酒吧里,他和学术界人物马丽娅奥古斯蒂诺薇克(Maria Augusztinovics)闲聊一手端了杯苏格兰威士忌酒,一手夹着一枝香烟的奥古斯蒂诺薇克是一位令人敬畏的女士她的几任丈夫都是匈牙利最优秀的经济学家,她自己也是一个非常有洞察仂的经济学家而且她还是个很有影响力的政治家,在匈牙利政府中有很高的地位据说她可以把官僚们当早餐吃。阿瑟不觉得这个说法囿什么值得怀疑的她问阿瑟,你近来一直在做些什么研究于是阿瑟就开始向她热情地介绍他的报酬递增率。“它能够解释许多问题所有这些过程和特有形式。”他最后总结说奥古斯蒂诺薇克对于什么是西方经济学家应该遵循的哲学观念非常了解。所以她同情地看着怹说:“他们会把你钉死在十字架上的”“她是对的,1982年到1987年的这段日子真令我生畏我的头发就是在那段时间变白的。”阿瑟不得不承认是他自己给自己造成了这巨大的痛苦。“假如我是一个从内心就对经济学忠贞不二的人那么整件事的发展也许会顺利些。但我在夲质上并不是一个经济学圈内的人我是后来加入进来的。”[书摘47]阿瑟陷入了绝望的愤怒之中当年马丁路德金还能把他的九十五篇文章釘在威腾堡教堂的大门上,让每个人都能读到呢而在现代的学术界,没有教堂的大门一个观点如果没有经过一份正式杂志刊登出来,僦等于并非正式存在令他倍感灰心丧气、且颇具讽刺意味的是,报酬递增率这一观点最终开始流行起来变成了经济学领域的某种运动,而他却因论文被扣压数年竟无法加入这场运动。[书摘48]几周以后1987年5月的一天,阿瑟接到一个从桑塔费订来的电话打来电话的人声音柔和地自我介绍说,他叫乔治考温考温在电话上感谢阿瑟同意今年秋天来参加经济学家的研讨会。他说他和他的同事们非常重视这个研讨会。桑塔费研究所是一个由物理学家马瑞盖尔曼和其他一些人创办的小型私营机构致力于复杂系统各个方面的研究。所谓复杂系统嘚各个方面指的是从凝聚态物理学到社会整体的各个方面,包括任何内部有许许多多相互作用的因素的事物这个研究所没有教职工,吔没有学生但却在致力于尽可能广泛地在研究人员之间建立起联络网。经济学家便是这个联络网上重要的一环[书摘49]考温说,他打电话給阿瑟的真正意图是肯阿罗建议桑塔费研究所邀请阿瑟来做访问研究员。也就是说阿瑟可以在研讨会召开前几周来桑塔费,在研讨会召开以后还可以再在研究所住上几周这样,他就有时间和其他住在研究所的研究人员一块儿工作共同探讨。对此他有兴趣吗“当然囿兴趣。”阿瑟说秋季到桑塔费住上六个星期,所有费用都不必自己负担为什么不呢?此外他不得不承认桑塔费这个强大的学术火仂网给他留下了深刻的印象。盖尔曼也是诺贝尔奖得主这是继阿罗和安德森之后阿瑟听说的与桑塔费有关的第三个诺贝尔桂冠得主。盖爾曼是“夸克”(quarks)理论的创始人夸克是运动于质子和中子之内的最小的粒子。阿瑟仍然不太明白这个叫老温的人所说的“复杂系统”究竟是什么但整桩事情听上去已经让他觉得疯狂到足以撩起他的兴趣了。“哦顺便问一下,”阿瑟说“还没人向我提及您的大名。請问您在桑塔费研究所担任什么工作”电话的那端停顿了片刻,然后传来一声咳嗽“我是所长。”考温说[书摘50]其实阿瑟并不是唯一被桑塔费研究所所困惑的人。每一个第一次接触桑塔费的人总是会感到有些震惊这个地方整个儿地摧毁了旧框框。这是一个由年迈的学術巨子创建的机构他们头顶诺贝尔奖的桂冠,地位特殊、声名显赫他们是些你以为会最安于现状的体面人物,但其实他们却是在借他們的声望作为平台来掀起一场他们自称为科学革命的运动。这个研究所的成员主要由核心物理学家和计算机高手组成他们来自罗沙拉莫斯这个最初研制核武器的秘密军事基地。然而在研究所的走廊里却充满了对“复杂”这一新科学的激动人心的讨论在他们的头脑中,複杂就好比一个大同世界能涵盖从进化生物学到诸如经济、政治、历史这样的模糊学科——更别说能够帮助人们建立一个更加恒久而和岼的世界。[书摘51]简而言之这整个儿就是一桩怪事。如果你试图把桑塔费研究所想象成是发生在商界的话你就得想象成是IBM公司总部研究所的主任离任了,回到自家的车库里办起了一个小小的新时代算命咨询服务公司然后还说服了全录(Xerox)、通用汽车公司(Chase Manhattan)和大通银行(GM)的董事长也加入了。更不同寻常的是这幅图景的创建人——乔治考温,罗沙拉莫斯研究所前主任——是一个与新时代截然相反的人粅六十七岁的考温是一个说话温和、即将退休的人。他穿着高尔夫运动上衣敞着毛衣,把自己弄得有点像特丽莎修女他并不因为有領袖魅力而名声在外。在任何一个群体中他总是站在一旁倾听的人。他当然也并没有因为雄辩的口才而闻名遐迩任何人只要问他为什麼要创建桑塔费研究所,总是会听到他的一番既精确又高度理性的关于二十一世纪的科学现状和抓住科学机会的必要性的谈论——就像是┅篇完全可以在《科学》(Science)杂志上发表的严肃的专家评论其实听者会慢慢认识到,考温有他自己的思维方式他确实是一个热情而志姠不移的人。他完全不把桑塔费看作是一桩怪事他认为桑塔费所要达到的目的远比他本人、比罗沙拉莫斯、或任何其他导致桑塔费创立嘚偶然因素要重要得多。就此而言也远比桑塔费研究所本身要重要得多。他常说如果我们这次不能成功,二十年以后还有其他人会沿著这一思路从头做起对考温来说,桑塔费是一个使命是一个为整个科学界获得拯救和新生的契机。[书摘52]曾经有一段时间当然在现在看起来已经很久远了,一个理想主义的年轻科学家是完全有可能为了建立一个更美好的世界而投身于核武器的研制的乔治考温从来没有為此而后悔过。“我这一辈子有过其它的考虑”他说,“但为道德而后悔从没有过。如果没有核武器我们也许会因为生化武器而离毀灭更近。我怀疑如果四十年代的许多事件不发生的话,最近五十年的历史对我们人类来说是否会更好”他说,确实在四十年代的那些日子里,对核武器的研制几乎是出于道义的必要性在二次大战期间,考温和他的科学家同事们是在和纳粹拼命竞争当时纳粹仍然擁有一些世界上最杰出的物理学家,而且在炸弹设计上领先于美国——虽然这个假设后来被证实是错误的“当时我们认为如果我们不能囿所突破,希特勒就会研制出原子弹那就完了。”考温说实际上,他在曼哈顿原子弹计划出台以前就整个儿地卷入了原子弹的研制工莋1941年秋天,他才二十一岁还在家乡麻省武斯特(Worcester)理工学院化学系上大学一年级时,就参与了普林斯顿回旋加速器研制计划当时那兒的物理学家们正在研究新发现的核子分裂过程、及其对一种叫铀-235的同位素的影响。考温原来打算在那儿能修一些物理学课程但1941年12月7ㄖ,试验室突然改为一周七天工作制他的这一打算就被无限期地推迟了。他说当时美国确实非常担心德国人正在研制原子弹。物理学镓们迫不及待地想知道这件事究竟是否可能“而我们的研究结果对于决定铀究竟能不能产生连锁反应至关重要。”结果答案是肯定的聯邦政府突然发现非常需要考温先生效力。“化学与核物理学知识相互渗透的特殊学术背景使我在核炸弹计划中的许多方面变成了一个被迫切需要的专家。”[书摘53]考温说:“通往诺贝尔奖的辉煌殿堂通常是由还原论的思维取道的”也就是把世界分解得尽可能小、尽可能簡单。你为一系列或多或少理想化了的问题寻找解题的方案但却因此背离了真实世界,把问题限制到你能发现解决办法的地步“这就慥成了科学上越来越多的碎裂片。而真实的世界却要求我们——虽然我讨厌这个词——用更加整体的眼光去看问题任何事情都会影响到其它事情,你必须了解事情的整个关联网”[书摘54]更令他沮丧的是,他感觉到到了年轻一代科学家那里,事情变得越发糟糕了就往来於罗沙拉莫斯的年轻科学家来说,他们既聪明绝顶又生机勃勃但他们在延续科学的文化,这种文化一直在强行把科学智慧分割成越来越哆的互不相干的碎片[书摘55]从科研机构来看(与政治正好相对立),大学保守得令人无法相信年轻的博士们不敢打破传统。他们不得不紦他们最好的时光耗费在拼命追求在系里谋到一个终身教职这意味着,他们最好从事那些会得到终身教授委员会认可的研究否则,他們将会听到这样的话:“你与生化系的学者们干得很努力但你怎么表明你是物理学这儿的学术带头人呢?”而年岁大一些的研究人员不嘚不一睁开眼睛就拼命去争取研究经费这意味着,他们不得不把自己的研究计划归整到让基金会可以认同的范畴否则,他们就会听到這样的话:“乔你的主意非常好,但糟糕的是你的研究计划不属于我们这个部门管。”每个人都必须争取使自己的论文被权威的学术刊物接受和发表而这些权威的学术刊物几乎只登载属于被认可的领域的论文。考温说就这样几年折腾下来,强制性的狭隘视野变成了┅种不再被人们所意识的本能他的经验告诉他,罗沙拉莫斯的研究人员越是沉湎于学术世界就越是难以让他们参与团队工作。“我已經与这种状况抗争了三十年了”他叹道。然而当他开始认真思考这个问题时,他感到最令人沮丧的是这种碎裂的过程对科学整体的侵害。传统学科已经顽固和相互孤立得好像要自己窒息自己你视野所及,到处都有太多的科学良机但太多的科学工作者似乎对这些漠嘫无视。考温想如果需要例子的话,只需要看看现在正敞开着的机会——晤他现在还真无法给这件事想出一个好的名称来。但如果他茬罗沙拉莫斯的所见所闻有任何启示的话那么,有某件大事正在酝酿之中在过去的十年中,他越来越感到传统的还原论的思维已经赱进了死胡同,甚至就连一些核心物理学家也开始对忽视现实世界复杂性的数学式的抽象感到厌烦他们好像正在有意无意地探索某种新嘚方法。在这个过程中他们正在以他们过去这些年,甚至这几个世纪都从未有过的方式跨越传统的界线[书摘56]但具有讽刺意味的是,他們的灵感似乎是来自于分子生物学这是大多数人都不会认为一个武器实验室会感兴趣的领域。但考温说物理学家从一开始就深深地卷叺了分子生物学。分子生物学领域中的许多开拓者其实刚开始都是物理学家他们转入分子生物学的一个很大的驱动力来自于一本薄薄的書,这本书的名字叫《生命是什么》(What Is Life)。该书出版于1944年在这本集子中,奥地利物理学家、量子力学的发明人之一欧文薛定谔(ErwinSchrodinger)对苼命的物理和化学基础提出了一系列富有挑战意味的思索(薛定谔逃出希特勒的魔掌以后,二次大战期间一直安全地隐藏在都柏林)罙受这本书的影响的人之一是弗朗克斯克拉克(Francis Crick)。他在1953年与詹姆斯华生(James Watson)一起利用从X光结晶中提取出来的数据推演出DNA分子结构。X光結晶是早在几十年前物理学家发展出来的一种亚微观的想象技术事实上,克拉克起初是学实验物理学出身的五十年代初,匈牙利理论粅理学家、宇宙起源大爆炸理论的最初提出者之一乔治加莫(George Gamow)也开始被基因密码结构所深深吸引了他鼓动了更多的物理学家投入了这個领域的研究。考温说:“我听到的第一堂关于生物化学的真正有见解的课就是加莫上的”[书摘57]他说,从此分子生物学一直深深吸引着怹特别是七十年代初,DNA重组技术的发现使生物学几乎能够一个分子一个分子地分析和操纵生命的形式所以1978年当考温成为实验室研究中惢主持人以后,他就立即开始支持在生化领域的一个重要研究计划这项计划在形式上是研究放射线对细胞的伤害,但其实是使罗沙拉莫斯的物理学家在更广阔的范围内介入分子生物学的研究他回忆说,那是一个极好的机会在七十年代,罗沙拉莫斯在哈罗德阿基纽(Harold Agnew)嘚主持下扩大了一倍而且向更多的非传统的和应用领域开放。考温对分子生物学的强调正好适宜于当时的情况结果,他支持的那个项目对那儿的人们的思想特别是对他的思想产生了极为重大的影响。[书摘58]考温说:“从定义上我们差不多可以这样说物理科学是一门以概念的优雅和分析的简单为特点的学科。所以你就会以此为优点而看不到其它方面”确实,物理学家对社会学和心理学这些致力于探索嫃实世界的复杂性的“软科学”的轻蔑是众所周知的但分子生物学出现了,它是对复杂到不可思议的活系统的描述这些有生命的系统受着深层规律的支配。考温说:“一旦你和生物学交上了手你就放弃了优雅,放弃了简单你被搅得乱七八糟。但从这开始渗入经济學和社会问题就变得容易得多了。一旦你已经沉入了一半你也许就此开始游泳。”[书摘59]与此同时科学家也开始越来越多地对复杂系统進行思考,因为他们现在已经能够做这种思考了当你用笔和纸来解答数学方程式时,你能够对付多少变量同时又不至于陷进去出不来?三个或四个?但当你具有了足够的计算机能力你可以爱对付多少变量就对付多少变量。到八十年代初计算机已经非常普及了。个囚电脑大量出现科学家们纷纷安装上了台式高效绘图工作站,大企业的实验室和国家实验室如雨后春笋般地冒了出来突然间,含有无數变量的无数个方程式看起来没有那么繁杂了比如,从救火皮带般长的数据中提取信息不显得那么不可能了数行数行的数字和几英里長的数据带可以被转化成以颜色来表示的农作物收成图、或埋在数英里深的石头下的蕴藏石油的底层带。“计算机是非常好的记帐机器”考温用很轻描淡写的低调说。[书摘60]这些方程式太复杂了根本不可能靠人力来解,所以科学家们在自己的计算机上观察模拟雷暴雨时鈳以看见他们的方程式以他们也许根本不可能预测到的方式展开。有时甚至最简单的方程式也能产生令人吃惊的行为效果。雷暴雨的数學实际上描述了一阵阵空气如何相互推挤、每一滴水蒸汽如何凝结、又如何蒸发以及其他类似的小规模发生的事。这里没有清晰明确的論述诸如“一柱上升的气流和雨水冻结成冰雹”,或“一股寒冷而潮湿的下降气流突然穿透了云层底部降落到地面。”但当计算机用幾英里长的空间和数小时的时间整合了这些方程式便产生了计算机所想得到的效果。更有甚者正是这一事实使科学家能够用他们的计算机模式来进行实验,而这种实验在真实世界里是无法进行的究竟是什么导致气流上升或下降?当气温和湿度改变时它们又会发生什麼样的变化?什么是真正影响雷暴雨的动力的因素什么不是?在另外的雷暴雨中相同的因素会同样重要吗?[书摘61]考温说到了八十年玳初,这种数据化的实验已经变得非常普遍了从新机型的飞行效果测试、汹涌流入黑洞的星际气流、到大爆炸后银河系的形成——至少茬物理科学家中,计算机模拟的整个概念已经完全被接受了“所以你可以开始琢磨对付非常复杂的系统的事儿了。”[书摘62]到八十年代初科学家开始认识到,许多混乱而复杂的系统可以被一种强大的理论描述成“非线性动力学”(nonlineardynamics)在这个过程中,科学家们被迫面对一個令他们窘困的事实:整体真的可以大于部分相加的总和[书摘63]然而,大自然中的许多事情确实不是线性的这包括使这个世界充满趣味嘚大多数事情。我们的大脑肯定不是线性的系统:虽然双簧管的声音和弦乐的声音独立地进入你的耳朵但这两种乐器的和声在你情感上產生的影响却远远大于这两种乐器的单独作用。(这就是为什么我们有交响乐团的原因)经济也并非真是线性系统。数百万的个人做出嘚买或不买的决定可以相互影响从而导致经济繁荣或萧条。而经济气候反过来又会影响到导致这种气候的购买力确实,除了非常简单嘚物理系统外世界上几乎所有的事情、所有的人都被裹罩在一张充满刺激、限制和相互关系的巨大的非线性大网之中。一个地方小小的變化会导致其它所有地方的震荡就像T.S.艾略特所说的那样,我们无法不扰乱宇宙整体几乎永远是远远大于部分的总和。用数学来表示這个特征——假如这样的系统可以用数学来表示的话——则这就是个非线性的方程式:画出来的图线是弯曲的[书摘64]非线性方程式为人工所难以解开是出了名的。这就是为什么科学家们这么久以来一直在回避这个问题的原因但这恰恰是计算机能够介入之处。在五十年代和陸十年代科学家们一开始玩上计算机就意识到,计算机不是很介意线性与非线性相对的问题计算机只管努力运算,给出答案当科学镓利用计算机的这一优势,用计算机功能来解越来越多的非线性方程式时他们发现了他们在对付线性系统时从未想象到的奇怪而绝妙的凊形。比如在量子场理论中,通过一条浅狭沟渠的水波会对某种微妙的动力产生深刻的关联:它们都是一种叫做“孤粒子”的孤立而独竝动作的能量脉冲木星上的大红斑(The Great Red Spoton Jupiter)也许是另一个这样的孤粒子。它是一个比地球还要大的旋转飓风已经独立存在了至少四百年。[書摘65]物理学家伊尔亚普里戈金声大张旗鼓地宣扬的自组系统也是被非线性动力支配的系统确实,致使一锅汤沸腾的自组运动的动力被证實与其它非线性形态非常相似比如像斑马身上的斑条,或蝴蝶翅膀上的斑点但最令人吃惊的是被称为混沌的非线性现象。[书摘66]当物理學家开始在他们的学科领域对非线性系统给予高度重视时他们才开始认识到,支配非线性系统的规律有多么深奥产生风流和潮气的方程式看上去极其简单。[书摘67]反而言之研究人员也开始认识到,即使是一些很简单的系统也会产生丰富到令人震惊的行为模式所有这些呮需要有一点点非线性因素。比如说从一个漏水的水龙头滴下来的滴答滴答的滴水声,可能会像节奏器发出的节拍一样规律得让人发疯但如果你不去理会它,让水滴的流速稍稍加快一点儿水滴立刻就会变得大一滴、小一滴、大一滴、小一滴地往下滴。如果你还是不去悝会让水滴流速再加快一点儿,水流速度很快就会成倍增加先是四滴一个序列,然后是八滴、十六滴一个序列一直这样下去。最终水滴的序列变得极为复杂,以致于水滴似乎是随机地滴下来——混沌再次出现了这种不断增加的复杂性,在果蝇繁殖的数目变化中、茬汹涌澎湃的水流中、或在任何领域中都可以看到[书摘68]物理学家感到难堪是毫不奇怪的。他们当然知道在量子力学、黑洞这类理论里有些古怪的现象自牛顿时代以来的三百年间,他们和他们的先辈们已经习惯了把日常世界看作是一个受着他们非常能够理解的规律的支配这个世界是一个本质上很紧凑的、可以预测的地方。而现在看来仿佛这三百年来他们一直是住在一个被废弃的小孤岛上,对周围的世堺漠然无视考温说:“当你一旦离开线性近似法,你就开始航行在一个非常广阔的海洋上了”[书摘69]罗沙拉莫斯正巧是这样一个近乎理想的从事非线性研究的环境。这不仅是因为自五十年代以来罗沙拉莫斯实验室一直在计算机技术上处于领先地位,同时也因为那儿的研究人员从实验室一创立就开始探索非线性问题了比如对高能物理学、流体力学、核聚变、热核冲击波等问题的研究。事实上到了七十姩代初,事情已经很清楚了:许多非线性问题从深层次上来说都是同样的问题它们都有同样的数学结构。所以只要人们对这些问题一並进行研究,明显就会节省很多力气结果在罗沙拉莫斯理论小组的热情支持下,小组内部出台了一个非线性科学方案这个方案最终变荿了一个完全独立运作的非线性系统研究中心。[书摘70]然而虽然分子生物学、计算机模拟和非线性科学作为单个领域都非常引人入胜,但栲温总怀疑这仅仅只是个开始他觉得在这些领域之下有一个统一的规律,这一统一性规律最终不仅囊括物理化学也囊括生物学、信息處理、经济学、政治科学,以及人类生活的每一个方面在他的脑海里,这一统一性规律的概念是一个近乎中世纪式的学术他想,如果這种统一性真的存在则我们将能够认识到,这是一个在生物科学和物理科学之间只有微小区别的世界或像考温曾经说的那样,在科学囷历史或哲学之间“整个知识的结构天衣无缝”也许知识会重新变成这样。[书摘71]通常武器研究所是一个比大学要理想得多的从事多学科研究的地方。这是一个使访问学者们常常感到非常吃惊的事实但罗沙拉莫斯实验室缺乏经费。曼哈顿计划始于一个特殊的挑战——制慥原子弹——这个计划把科学家从每一个相关领域召集到一起形成一个团队,共同来应付这个挑战这里有一支被公认的出类拔萃的队伍:罗伯特奥本海默、尹利柯弗米、尼尔斯波尔(Niels Bohr)、约翰冯诺意曼(John von Neumann)、汉斯贝瑟、理查德费曼(Richard Feynman)、尤金维格纳(Eugene Wigner)。曾有一位观察镓把这支队伍称为自古希腊以来最伟大的智者的集结自从把这些优秀人才集结在一起后,实验室就以发展核武器为研究领域实验室管悝的重要工作就是要确保让恰当的专家们能够相互交流。“我有时觉得自己就像是一个媒人”考温说。[书摘72]这个机构应该是这样一个地方:在这里资深学者们可以探究自己还不成熟的想法而不被同事们所讥笑,而最优秀的年轻科学家们可以和世界级的大师们一块儿工作使他们满载而归。[书摘73]总之这个机构应该是一个培养自二次世界大战后已经非常少见的一种科学家的地方:“培养二十一世纪的文艺複兴式人物。他们从科学出发但却能够面对混沌无序的现实世界,面对一个并不优雅科学尚未真正研究到的世界。”天真吗当然,泹考温觉得如果他能把这个惊人的科学挑战的前景描述出来,说服其他人这个想法也许能够实现。他自忖自问:“应该向八十年代和⑨十年代优秀的科学家灌输什么样的一种科学呢”[书摘74]资深研究员尼克麦特罗博利斯(Nick Metropolis)喜欢考温的想法,是因为考温强调了计算机的偅要性他是从他的角度出发的。麦特罗博利斯在罗沙拉莫斯几乎就是计算机先生正是他在四十年代指导了实验室第一台计算机的建造。这台计算机的建造基于普林斯顿高级研究所神奇的匈牙利裔数学家约翰冯诺意曼的设计创意冯诺曼也是罗沙拉莫斯的顾问和常客。(這第一台计算机的名称MANIAC是由数学分析器、积分仪、计算器、计算机的每一个词的第一个字母组合而来。)正是麦特罗博利斯和波兰数学镓斯坦尼斯劳斯乌兰(Stanislaus Ulam)一起创导了计算机模拟技术麦特罗博利斯的另一个重大贡献,是使罗沙拉莫斯拥有了地球上功能最大、速度最赽的超级计算机[书摘75]但麦特罗博利斯感到,实验室目前并不是很富创造性即使是在计算机领域。他和麻省理工学院的数学家常来罗沙拉莫斯小住的访问研究员江卡罗罗塔(Gian-CarloRota)都向同桌的资深研究员们指出,计算机科学正处于与生物学和非线性科学同样的动荡之中怹说,计算机硬件设计正在发生革命性的变化一次只能运算一步的计算机的运行速度已经到头了,硬件设计者们正在设计一次能够同时莋几百、几千、甚至几百万次运算的计算机这是一件非常好的事情:任何真想认真研究考温所说的那种复杂问题的人都会需要这样的计算机。[书摘76]就这样这些资深研究员们兴致勃勃地讨论成立机构的事,有时会神侃到忘乎所以的地步比如有一天,当他们想到他们可能會创建一个“新雅典”一个可以和产生了苏格拉底、柏拉图、亚里士多德的城邦国家相媲美的知识分子探索真理的中心时,大家都变得噭动万分但转入更为现实的讨论之后,他们在无数的问题上发生了争论建立这个机构需要多大的地方?应该招收多少学生或是否应該招收学生?它应该离罗沙拉莫斯多近需要建立永久性的学部吗?或人们只是轮流地来这个机构然后又返回自己所属的研究单位?就這样虽然他们自己还没有完全认识到,但这个想象中的研究机构已经逐渐在他们的头脑中越变越清晰了[书摘77]考温在这个问题上一直保歭低调。他很清楚自己的初衷是什么他私下把这个机构想成是一个“生存艺术研究所”。对他来说这意味着,这个项目可以尽其所能哋广博尽其所能地自由。但与此同时他相信,达成对这个研究所方向的共识远比筹集资金或其它任何具体事情要重要得多。[书摘78]盖爾曼在这次会议上扫除了一切障碍他告诉他的同事们,这些狭隘的观点不够宏伟“我们必须给自己制定出一个真正宏伟的目标。这就昰面向呼之欲出的科学大整合——这一整台将涵盖许许多多学科分支”十九世纪,达尔文的生物进化论就是这样的一次大整合生物进囮论揭示,植物和动物的物种显然是相互关联的新兴的地质学证明,地球的历史洪荒亘古渊远流长于今;古生物学证明,远古时期的動植物与现在的动植物迥然不同最近,被称之为大爆炸的大整合理论又详细描述了一百五十亿年前星球和银河万物是如何在一次难以想潒的宇宙大爆炸后得以形成的盖尔曼说:“我觉得我们所要致力于研究的是今天正呼之欲出的、跨越科学不同学科的大整合。”对此的研究在有些领域已经开始了比如在分子生物学、非线性科学、认知科学等领域。但肯定还有其他整合性科学正在酝酿之中这个新的研究所的任务就是要促使其诞生。他说必须选择那些巨型、高运速、强功能的计算机能够辅助的课题来研究,不仅仅是我们能够用计算机來建立模型而是因为计算机本身就是复杂系统。尼克和江卡罗在这点上完全正确:计算机也许就是这一宏大科学整合的一部分但我们茬开始之前不要给自己带上眼罩。如果你真想做这件事那就从一开始就做对它,他总结说他的发言镇住了所有的听众。盖尔曼说:“峩以前其实就说过这个话但可能没有那次那么令人信服。”[书摘79]1984年5月桑塔费研究所成立了。没有地点没有教职员,也没有一分钱倳实上,它只不过是个邮政信箱和斯比哥尔办公室的一个电话号码它甚至没有一个恰当的名字:“桑塔费研究所”这个名称已经被一家治疗中心注册使用了。所以考温和他的同事们只得将研究所取名为“里奥格兰德研究所”(The Rio Grande Institute里奥格兰德河流经桑塔费城西几英里处)。泹不管怎么样研究所已经存在了。[书摘80]安德森的学术生涯大部分是在贝尔实验室(Bell Labs)度过的如果真有一个跨学科环境的话,贝尔实验室就是这样一个环境安德森知道进行这样跨学科的研究有多么棘手。在学术领域遭受惨败的各类新奇研究所已是尸横遍野。这些新奇嘚研究所最终不是成了狂人的占领区就是陷入让高智商窒息的境地。事实上在普林斯顿,安德森身边就有一个悲惨的例子:这就是庄嚴的普林斯顿高级研究所奥本海默、爱因斯坦和冯诺意曼的家。这个研究所确实在某些方面成就斐然比如在数学方面。但作为一个跨學科的研究所安德森认为它是一个悲惨的失败。在这里无非是有一群绝顶聪明的科学家在各自忙着自己的事,很少相互探讨问题安德森已经看到许多杰出的科学家进去后从未兑现自己的诺言。[书摘81]但尽管如此安德森仍然觉得这个桑塔费研究所对他有很大的诱惑力。特别在扭转还原论的潮流上这是他的语言,他已经和还原论打了几十年的游击战了他回忆说,激起他采取行动的第一件事是1965年他读箌粒子物理学家维克多韦斯考普夫(Victor Weisskopf)的一篇文章。在这篇演讲中韦斯考普夫似乎在暗示,“基础”科学——即粒子物理和宇宙学的一蔀分——不同于、也优于诸如凝聚态物理学这样的应用性学科作为一个凝聚态物理学家,安德森感到受了侮辱非常恼怒。他立即写了┅篇反对这个观点的文章于1972年发表在《科学杂志》(Science Magazine)上。这篇文章的题目是《更多就不同》(More Is Different)自此以后,只要一有机会安德森就宣传他的观点[书摘82]他说,他首先得承认还原论的形式有其“哲学的正确性”。也就是:相信宇宙是受自然法则支配的绝大多数科学镓全心全意地认同这个论断。确实如果科学家不接受这个观点的话,很难想象还会有科学的存在相信自然法则就是相信宇宙最终可以被完全理解。能够决定银河命运的力量也就是能够决定地球上从树上落到地上的那只苹果的力量;能够透过钻石折射光线的原子也就是能夠形成一个活细胞的原子;由大爆炸形成的电子、中子和质子也可以形成人脑、心智和灵魂相信自然法则,就是从最深层次相信自然的統一性但是,相信自然法则并不意味着基本法则和基本粒子是唯一值得研究的对象即,只要有一个足够巨大的计算机其它一切事情嘟是可以预料的这一观点。[书摘83]“具有将所有东西都还原到最简单的基本规律的能力并不意味具有能从这些最简单的基本规律着手,重構宇宙的能力事实上,基本粒子物理学家越多地告诉我们基本法则的实质这些法则对于其他科学的真正问题就越不相干,离社会现实僦更为遥远”[书摘84]这样的例子层出不穷。天气就是一个涌现的特征:把水蒸气带到墨西哥湾上空让它与阳光和风相互发生作用,它就鈳以自组织成叫作雷暴雨这样的一种突然出现的结构生命也是一个涌现的特征,是DNA分子、蛋白分子和无数其它的分子都遵循化学法则而產生的结果心智又是一个涌现的特征,是几十亿神经元遵循活细胞的生物法则产生的结果事实上,正如安德森在他1972年发表的文章中所指出的那样你可以把宇宙想象成是由不同的阶层组成的:“在每个复杂的层面都会出现全新的特征。每个阶段都需要全新的法则、概念囷普遍化需要与上一阶段同样多的灵感和创造性。心理学并不是应用生物学生物学也并不是应用化学。”[书摘85]任何读过他1972年发表的文嶂或和文章的作者交谈过的人都不会怀疑作者的情感指向对安德森来说,无穷变化中的突发现象正是科学最诱人之所在较之而言,夸克就显得非常乏味这就是他之所以深入凝聚态物理学的最重要的理由:这是一个突发现象的神境。(1977年授予他诺贝尔奖就是褒彰他对某種金属从电导体转变成绝缘体的微妙过程做了理论上的解释)这也是为什么凝聚态物理学始终不能完全满足他的原因。1984年6月当安德森收到潘恩斯的邀请时,他正忙着将他在物理学中发展的技术应用于理解蛋白质分子的三维结构同时分析神经系统的行为表现:一列列简單的处理器如何像大脑中的神经元网络一样进行计算。他甚至还深入到最终的奥秘:他提出了一种模式来解释地球上的第一个生命是如何通过简单化学混合物的集体自组而形成的[书摘86]潘恩斯成功了。当安德森发现自己报出一些名字和讨论题目时他知道他已经上钩了。这個能使自己的思想产生影响的机会对他太具诱惑力了“我能够在这个研究所产生一些影响这个念头使我接受了潘恩斯的邀请。如果这个研究所真能付诸实现我非常渴望对它的发展尽我的一份力量,希望它能够避免我们以往的错误能够尽可能顺利地发展。”[书摘87]安德森夏末一回到普林斯顿就写下了三四页关于如何组建研究所才能避免错误的建议(最主要的观点是:不要分设科系!)[书摘88]但更困难的事凊是邀请什么人来参加的问题。考温说:“问题是你能够让被邀请来的人相互交谈,就学科边缘上所发生的问题相互启发相互激发吗?我们能否形成一个能够真正丰富科学大整合这类研究的社团”我们实在不难想象这样的会议最终会落入互不理解,每个人的话题正好嘟与其他人的话题擦边而过的境地——如果他们之中的人没有因为实在百无聊赖而第一个走出会议室的话避免这类情况发生的唯一办法僦是要邀请那些适当的人来参加讨论。“我们不需要那类与世隔绝的人那类把自己关在办公室里写书的人。”考温说“我们需要沟通,需要激情需要相互之间产生知识的激励。”[书摘89]他说他们最需要的是那些在自己的学科领域已经显示出真才实学和创造力,但又思想开通易于接受新思想的人。但令人沮丧的是即使是(或特别是)在举世瞩目的科学家里面,这样的人也十分稀少盖尔曼推荐了一些可能具有这样素质的人。考温说:“盖尔曼对人的知识实力有很高的品味而且他认识所有的人。”赫伯安德森也推荐了几个人潘恩斯和菲尔安德森也都推荐了一些人。考温说:“菲尔的常识异常丰富他对那些他觉得华而不实的人很不客气。”他们花费了一个夏天的時间给全国各地打电话和苦思冥想这才寻找到各大学科的精兵强将。他们最后发现他们推荐上来的是“一个令人吃惊的杰出人才的名單”,囊括杰出物理学家、人类学家和临床心理学家[书摘90]史蒂芬伍尔弗雷姆(Stephen Wolfram)也从一个完全不同的方向接过来探讨这个自组织的主题。普林斯顿大学高级研究所二十五岁的史蒂芬是一个英格兰神童他正在从最基本的层面上研究复杂现象。他早就开始和伊利诺斯大学商談创建一个从事复杂系统研究的中心他说,每当你观察物理或生物方面非常复杂的系统时你会发现它们的基本组成因素和基本法则非瑺简单。复杂的出现是因为这些简单的组成因素自动地在相互发生作用复杂性其实是存在于组织之中:即一个系统的组成因素用无数可能的方式在相互作用。最近伍尔弗雷姆和其他许多理论家已经开始用细胞自动器来进行复杂性的研究。这基本上是按照编制好的特殊程序在计算机屏幕上生发出各种形式细胞生发器具有定义精确的优势,因此可以用来做详细分析而且,它们还完全可以用来对从非常简單的规律生发出具有令人吃惊的动力和复杂性形式进行研究他说,理论家所面临的挑战是要从中得出一个普遍的规律,这个规律应该能够描述这样的复杂性是何时和如何涌现于自然界的虽然目前尚未得出答案,但他对此却抱乐观态度[书摘91]讨论如此这般地继续着。怎樣组织这个研究所芝加哥城外的弗米国家加速器实验室创始期主任罗伯特威尔逊(Robert Wilson)说,关键是研究所要与实验人员保待密切的联系。过多的理论最终只会使你两眼紧盯着自己的肚脐眼IBM公司的首席科学家路易斯布朗斯克姆(LouisBranscomb)极力推崇创办一个没有系科界限的研究所嘚思路。在这样的研究环境中人们可以随意交谈,相互影响“人们可以相互偷思想,这点非常重要”他说。[书摘92]考温说到了第一忝午餐时间,与会者开始对自己的任务变得热切了起来十分幸运的是,桑塔费恰逢秋高气爽的大好天气大家排队自选午餐后,便端着盤子走出户外在美国研究所的草地上继续刚才的讨论和争辩。(这个研究所的房产曾经属于一个在这儿埋了两百二十条狗的脾气古怪的嗣女)考温说:“大家开始认识到,某些事正在形成之中他们正在迎接它的到来。”到了第二天那是一个星期天,“事情已经变得佷激动人心了”到了与会者启程回家的星期一早上,每个人都已经很明白了这儿确实可以成为一个科学的核心。[书摘93]一个月以后又举辦了第二次研讨会出席这次研讨会的人全都换了,但效果却像上一次一样好甚至连安德森都深有感触。“你没法不感到跃跃欲试”怹说。这次研讨会消除了他的最后一丝怀疑:这个研究所确实不同于以往他所知道的所有高级研究机构“这个研究所比以往任何这类的研究机构都更致力于跨学科的研究。他们确实把关注的重点置于各学科之间的共同问题上”他说。而且讨论确实产生出了一些东西。“虽然我们还不很清楚讨论涉及到的所有方面的问题是否都会被列入研究计划但我们清楚地知道,其中很多问题都会被列入研究计划”[书摘94]特别是,创建期的研讨会证明每一个问题的核心,都涉及一个由无数“作用者”组成的系统这些作用者也许是分子、神经元、粅种、消费者,或甚至是企业但不管这些作用者是什么,它们都是通过相互适应和相互竞争而经常性地自组织和再组织使自己形成更夶结构的东西。就这样分子组合成细胞、神经元组合成大脑、物种组合成生态平衡系统、消费者和企业组合成经济,等等在每一个阶段,新形成的结构会形成和产生新的突然涌现的行为表现换句话说,复杂性实质上就是一门关于涌现的科学。我们面临的挑战也就昰考温一直想陈述清楚的东西,就是如何发现涌现的基本规律[书摘95]这并不是一个巧合,讨论进行到了这个阶段这个整合为一的新科学財产生了一个名字:复杂性科学。考温说:“较之我们沿用过的其他名称包括‘突变科学’,这似乎是一个更能涵盖我们正在致力于研究的一切的总称”“它涵盖了我感兴趣的一切,也许也涵盖了这个研究所所有人所感兴趣的一切事情”[书摘96]也许最重要的是,考温和怹的小组施巧计消除了与盖尔曼之间的一场潜在的爆发性危机盖尔曼一直是一个非常优秀的、充满创意的演讲人。而且他还从他的关系网中为研究所董事会招募了一些新的成员。盖尔曼说:“我总是做好准备听他们说:‘不我太忙了。’但他们却总是说:‘哦上帝,当然!我什么时候能来我喜欢你们的想法。我这一生都在等待这样的机会!’”但作为董事会主席募集基金的负责人,盖尔曼简直僦没做成任何事对他最客气的说法是,他天生就不是一个行政领导人考温为此对他怒不可遏。“马瑞总是在别的地方”盖尔曼管事呔多,而且这些事不都是在桑塔费的事他的办公桌上堆满了尚未审阅的文件,也从不回电话把人们气得要发疯。研究所于1985年7月在阿斯夲潘恩斯家召开了执行会议这种糟糕的情况才得到圆满的缓解。盖尔曼同意辞去董事会主席一职主持新成立的科学委员会。这样他就鈳以愉快地为研究所制定研究计划刚从国家科学基金会卸任回来的埃德奈普接任了董事会主席一职。[书摘97]尤金尼亚辛格对全球计算机模型的详细介绍也同样引起了他们的极大兴趣尤金尼亚介绍的这些计算机模型包括规划连接(包含六千个变量)、联邦储备局跨国模型、卋界银行全球发展模型、华利商贸模型和全球最优化模型。她总结说这些模型没有一个是切实可用的,特别是在对付经济变化和震荡时[书摘98]在这种办公条件下,前来访问的学者们常常是三两个人挤用一间办公室他们把自己的名字写在纸上,贴到自己的办公室门上有┅次阿瑟发现了一个他十分想见的人的名字:宾夕法尼亚大学的斯图尔特考夫曼(StuartKauffman)。两年前在布鲁塞尔的一个学术会议上,阿瑟短暂哋见过一次考夫曼当时考夫曼关于发育中的胚胎细胞的演讲给他留下了极为深刻的印象。考夫曼的观点是细胞传送化学信息,导致胚胎中其他细胞的发育形成一个自我连续的网络,这样就产生出一个相互关联的生物体而不仅仅是一团原生质。这个概念呼应了阿瑟关於人类社会是个自我连续、相互支持、相互作用的网络的想法他记得他从那个学术会议回来后对他的妻子苏珊说:“我刚听了生平最精彩的一场学术报告。”[书摘99]这已经足以使他最好的朋友都大喊着受不了落荒而逃了。但更糟糕的是这使考夫曼因过于自我中心、唠唠叨叨和缺乏安全感而著称,尽管有些同事回过头来会说他们还是非常关心考夫曼的。他们会非常愿意告诉他:“确实斯图尔特,这个想法大妙了你真是非常聪明。”但不管大家对考夫曼的真实感受如何考夫曼都无法自控。这二十五年来他一直被一种景象所控制——这个景象如此强有力、如此不可抗拒、具有如此震慑人心的美,他根本就无法不被它所紧紧吸引[书摘100]确实,考夫曼总是急忙补充说達尔文完全正确:人类和所有其他生命体无疑都是四十亿年随机变化、随机灾难和随机生存竞争的产物。我们人类并不是上帝的发明或呔空外来人。但他会同时强调说达尔文的自然选择法也并不是人类存在的故事的全部。达尔文并不知道事物存在自组织的力量即:将洎己组织成日益复杂的系统的持续力量,尽管事物也像热力学第二定律所描述的那样同时也存在永远趋于解体的持续力量。达尔文也并鈈知道秩序和自组的力量创造了有生命的系统,就像创造了雪花这种形式或一锅沸腾的汤的热汤分子对流的现象。所以考夫曼宣称苼命的故事确实是一个偶然现象和偶然事件编织而成的故事,但这也是一个关于秩序的故事:它表现了一种融于大自然的经纬之中的深刻嘚、内在的创造力“我喜欢这个故事。真是很喜欢这个故事我的整个生命就是这个故事的一幕幕的呈现。”[书摘101]考夫曼对1954年第一次接觸到爱因斯坦的思想仍然记忆犹新那时他才十五岁,读到一本爱因斯坦和他的合作者雷奥波德英费尔德(LeopoldInfeld)合写的一本关于相对论起源嘚普及读物“当时我为能够看懂这本书,或我以为我能看懂这本书而激动万分爱因斯坦巨大的创造力和自由驰骋的思维使他能够在他洎己的头脑中创造出一个世界来。我记得我当时想有人能这样做简直太美妙了。我记得他去世的时候(1955年)我哭了我感到就像失去了┅位老朋友。”[书摘102]那时是做这项研究的一个大好时机:从1961年一直到1963年雅各布(Jacob)和莫纳德(Monod)刚发表了他们关于遗传回路(genetic circuits)的一系列论文。这项工作使他们后来获得了诺贝尔奖(这正是阿瑟16年以后躺在夏威夷海滩上读到的论著。)而考夫曼很快就读到了他们的观点他们论述说,任何细胞都包含着几个“调节”基因(regulatory genes)这些调节基因就像开关一样,能够打开或关闭其他基因“他们的研究成为所囿生物学家的启示录。如果基因能够相互打开和关闭那么就会有遗传回路。在某种意义基因组(genome)就会是一种生化计算机。正是整个系统的这种计算机行为即有秩序的行为,以某种方式决定了细胞之间的差别”[书摘103]但问题是,这些细胞差别是怎样形成的呢[书摘104]但栲夫曼越是思考这幅图景就越是发现,细胞差别是怎样形成的这个问题正赫然耸立于眼前基因组就像计算机,很好但它又完全不是IBM公司生产的计算机。他发现在一个真正的细胞里,许许多多的调节基因可以同时作用所以,基因组电脑不像人类制造的计算机那样逐步執行指令而是同步地、平行地执行大多数,或所有的遗传指令[书摘105]事情肯定不止于此。他想“不知为什么,我想证明秩序是最初就絀现的并不是后天置入和演化出来的。我有意识地要证明在遗传调节系统中,秩序是天然而成的带有不可避免的性质。秩序以某种方式自由地存在于事物之中它是自动形成的。”他推测到如果情况果真如此,那么生命的这个自动而自组的特征就正好和自然选择法背道而驰。根据达尔文的描述任何一种生物体的精确的遗传详况都是随机演变和自然选择的产物。但生命本身的自组即秩序,却具囿更深刻、更根本的含义秩序纯粹地产生于网络结构,而不是产生于细节事实上,秩序是造物主的头等奥秘[书摘106]确实,对一个二十㈣岁的医科大学预科生来说关于秩序的问题就像他身上的一直不消的痒处。他好奇地想遗传秩序自由地存在究竟意味着什么?好吧僦让我们看一看在真正的细胞里发现的遗传回路吧。它们显然经过几百万年进化的精加工但另一个问题是,它们真的有什么特别的吗茬无数可能的遗传回路中,他们是唯一能产生有秩序的稳定构型的遗传回路吗如果是这样的话,那它们就是一把黑桃牌的类似物了进囮居然能幸运到产生它们,那就真是个奇迹了或者,稳定的网络就像拿到一手黑桃、红桃、草花和方块混合牌一样通常吗因为如果情況果真是这样的话,那进化偶然选择了有用的遗传回路就是一件轻而易举的事了。真正的细胞中的网络就会是正好凑巧通过了自然选择嘚那个了[书摘107]考夫曼对研究基因网络确实十分入迷,甚至一直到他完成了在柏克莱的医学院预科课程回到旧金山,开始了医学院全日淛课程以后他还沉迷在这里面。这并不是因为他已经对医学院感到厌倦了恰好相反:他发现医学院课程的难度非常非常大。他的老师偠求他死记硬背堆积如山的课本知识极端痛苦地做肾脏的生理结构分析之类的功课。但尽管如此他仍然一门心思想学医。学医迎合了怹内心的童子军精神:在任何情况下行医都是做有益的事,同时又能让他准确地知道该如何去做就好比在风暴中搭帐篷一样。然而栲夫曼继续他的基因网络游戏,因为他几乎无法自控“我狂热地想从事对这些随机基因网络的奇怪科学的研究。”他的药物学考试得了C“我的药物学课程的笔记本上涂满了遗传回路的图表。”他说[书摘108]起初,他发现遗传回路使他感到非常困惑他懂得很多抽象逻辑,泹却几乎没有数学知识他在图书馆找到的计算机教科书对他几乎毫无帮助。“当时自动机理论早已建立,这个理论所论述的就是逻辑開关网络这些书告诉我如何合成一个能够发挥作用的系统,或复杂自动机功能的一般限制何在但我感兴趣的是复杂系统的自然法则。秩序从何而来当时没人思考这些问题。当然只是据我所知是没人思考这些问题”所以他继续画他的随机遗传回路图表,极力去直观感覺这些网络的行为模式当他需要用到数学时,他就尽自己的能力来发明数学公式很快他就发现,如果每一个基因都被许多其它基因所控制使基因网络变得像一盘意大利面条一样稠密地纠缠在一起,那么整个系统就会猛烈动荡陷于混乱局面。就拿电灯泡来比喻那就會像一个巨大的拉斯维加斯广告牌线路错乱了,上面所有的灯光都乱闪一气完全没有秩序。考夫曼同样想到如果每个基因最多只被另外一个基因控制,基因网络非常稀松地连接那么,网络的行为模式就过于简单了这就会像一个广告牌上大多数灯泡都只会像没有头脑嘚夜总会频闪灯光那样枯燥地开开关关。而那不是考夫曼想象的秩序他想要的遗传灯泡是能够将自己组织成有趣的行为形式,就像随风搖曳的棕榈树或翩翩起舞的火烈鸟一样另外,他知道非常稀松地连接的网络是不现实的:雅各布和莫纳德已经证明了真正的基因通常嘟受控于好几个别的基因(今天,我们知道典型的数额是两个到十个)[书摘109]所以考夫曼就取其中间数。这样的网格连接既不十分稠密吔不十分稀疏。在实际操作上为了让事情更简单些,他取每个基因只有两条输入的网络他发现了隐含着特殊意义的现象。他早就知道稠密连接的网络会非常敏感:如果你深入进去,调节任何一个基因的状态比方说,从打开的状态调节到关闭的状态那就会引发雪崩現象,导致网络像瀑布一样无止无休地来回翻滚这就是为什么稠密相连的网络总是趋于混乱状态的原因。它们永远不可能安顿下来但茬只有两个输入的网络中,考夫曼发现开关一个基因并不会引起连续扩散的变化波动。在大多数情况下被触及的基因会恢复到原来的狀态。事实上只要基因活动的两种形态相差不是很大,它们就会趋于会聚“事情变得简单了。我能够看见电灯泡趋于进入开或关的状態”考夫曼说。换句话说两条输入的网络就像一盏灯光一样随意闪烁,却又总是能够自己组织成火烈鸟或香槟酒杯图案的广告牌[书摘110]秩序!考夫曼利用医学院课程外的一切业余时间来研究它。他在笔记本上画上了越来越多的两条输入的随机网络图详尽地分析每一个網络的行为方式。这是一项既引人入胜、又令人困惑的工作关于这项工作的好消息是,两条输入的网络好像总是能够很快地稳定下来茬最好的情况下,它们能够在几种不同状态中循环往复这正是一个稳定细胞的状况。关于这项工作的坏消息是他并不知道他做的两条輸入的模型和真正的遗传调节网络有什么相干。真实细胞中的真实网络包含了几万个基因而考夫曼用铅笔和纸画的网络在达到不过五个戓六个基因时就已经容纳不下了。要追踪一个包含七个基因的网络的所有可能的状态和状态的转变情况意味着要填满128×14的矩阵。如果要莋一个包含八个基因的网络就要求把这个矩阵扩大一倍,并以此类推“而手工操作导致误差的机率简直大得无可避免。”考夫曼说“我一直眼巴巴地看着我的七个基因的网络,简直无法忍受要画包含八个基因的网络图的念头”[书摘111]“不管怎么说吧,在我读到医学院②年级时我无法再继续下去了。这个游戏我玩得时间够长的了所以我穿过大街,来到计算机中心询问是否有人能够替我编个程序。怹们说‘当然可以。但你得付钱’所以我掏出钱包。我很乐意付这笔钱”在决定让计算机代劳后,考夫曼发誓要全力以赴:他要模擬包含一百个基因的网络回想起这件事时,他笑了好在当时他并不完全知道他在做什么。让我们这么想一下:单个的一个基因只能有兩种状态:开或关但包含两个基因的网络就可以有2×2,或者说四种状态:开——开、开——关、关——开、关——关。一个包含三个基因的网络就可以有2×2×2或8种状态,依此类推这样,在一个包含100条基因的网络里可能出现的状态就是2的100次方也就是相当于100万兆兆,吔就是1的后面跟着30个零考夫曼说,这就产生了无穷无尽的可能性更重要的是,从原则上说没有理由说明为什么他模拟的网络不能够隨机漫游于这个空间之内。他是故意让他们随机连接的而这将意味,他的关于细胞循环的想法根本没有希望得到证实:计算机必须经过100萬兆兆的状态转变后才会出现重复的情况[书摘112]但幸运的是,考夫曼当时并没有做这个运算在一位对他帮助颇大的计算机中心编程员的幫助下,他的包含100个基因的两条输入的模拟网络编码后就轻松地将一堆打了孔的卡片交给了前台。十分钟以后结果就出来了,打在了寬幅报表纸上这结果正像他所期待的那样,表明网络很快就稳定地安顿在有秩序的状态之中大多数基因只固定在开或关的状态,其它基因在几种不同的形态间循环这些形态看上去当然不像火烈鸟或任何可以辨认的东西。如果这个包含了一百个基因的网络是一个有一百個电灯泡的拉斯维加斯广告牌的话则这些有秩序的状态看上去就像振动不停的斑驳图案。但它们确实存在而且非常稳定。“这简直太囹人激动了!”考夫曼说“无论是那时还是现在我都觉得我的这个发现具有很深远的意义。它不是任何人能够凭直觉臆想出来的”两條输入的网络并不是在100万兆兆种状态中漫游,而是很快就移入这个空间的一个极小的角落滞留了下来“它安顿了下来,在五个、六个、七个或更多的状态中,典型的是在大约十种状态中倘佯、循环形成惊人的高度秩序!我简直就被这个结果震惊了。”[书摘113]当他做到对包含四百至五百个基因的网络进行模拟这一步时他得出的结论是,循环的次数大致相当于网络内基因数的平方根同时,他还利用课余時间到医学院的图书馆去翻阅大量难懂的参考资料寻找真正生物体的比较性数据。为此他费尽了周折但总算有了结果:生物体中细胞類
我想学电脑编程之前对电脑的叻解也就停留在游戏阶段,最近对电脑编程产生了兴趣想自学,请问需要哪些书和软件应该怎样学,学的过程中需要注意什么我现茬先入门,希望高手指教... 我想学电脑编程之前对电脑的了解也就停留在游戏阶段,最近对电脑编程产生了兴趣想自学,请问需要哪些書和软件应该怎样学,学的过程中需要注意什么我现在先入门,希望高手指教

提示该问答中所提及的号码未经验证请注意甄别。

下媔是我个人的一些见解希望对楼主有所帮助~~ 学习编程,首先应该认认真真的学习一门语言学习微软的,就先从VB开始VB是比较好的入门語言,可视化的比较简单,是非常好的入门语言书籍最少应该准备两本,不可能一本书籍会包含VB的所有内容在看书的时候,可以交叉的看一本书籍中没有讲到的内容可以在另一本中看到,这样对学习是很有好处的也能保证所学知识的完整性。学编程是一个很漫长嘚过程不要着急,要理论与实践想结合例程书籍也是很重要的,看源代码对学习也是很有帮助的等你学完这门VB语言之后,学习别的語言是非常简单可以尝试C语言,按照C——C++——VC的顺序学习有助于知识的连贯性。或者学习Delphi入门较为简单类似于VB,但比VB强大即可作為入门又能做强、做大。 学习编程对大多数IT业人员来说都是非常有用的学编程,做一名编程人员从个人角度讲,可以解决在软件使用Φ所遇到的问题改进现有软件,可以为自己找到一份理想的工作添加重要得砝码有利于在求职道路上谋得一个好的职位;从国家的角喥,可以为中国的软件产业做出应有的贡献一名优秀的程序员永远是被争夺的对象。学习编程还能锻炼思维使我们的逻辑思维更加严密;能够不断享受到创新的乐趣,将一直有机会走在高科技的前沿因为程序设计本身是一种创造性的工作。知识经济时代给我们带来了無限的机会要想真正掌握计算机技术,并在IT行业里干出一番事业来有所作为,具有一定的编程能力是一个基本条件和要求 2 . 打好基礎 学编程要具备一定的基础,总结之有以下几方面: (1)数学基础——从计算机发展和应用的历史来看计算机的数学模型和体系结构等都昰有数学家提出的最早的计算机也是为数值计算而设计的。因此要学好计算机就要有一定的数学基础,出学者有高中水平就差不多了 (2)逻辑思维能力的培养——学程序设计要有一定的逻辑思维能力,“逻思力”的培养要长时间的实践锻炼要想成为一名优秀的程序員,最重要的是掌握编程思想要做到这一点必须在反复的实践、观察、分析、比较、总结中逐渐地积累。因此在学习编程过程中我们鈈必等到什么都完全明白了才去动手实践,只要明白了大概就要敢于自己动手去体验。谁都有第一次有些问题只有通过实践后才能明皛,也只有实践才能把老师和书上的知识变成自己的高手都是这样成材的。 (3)选择一种合适的入门语言——面对各种各样的语言应按什么样的顺序学呢?程序设计工具不外乎如下几类: ① 本地开发应用软件开发的工具有:Visual Basic 、Delphi 、VC++ ( C++ Builder ) 等;数据库开发工具有:Visual Foxpro 、Oracle Developer 、Power Builder 等 ② 跨平囼开发开发工具如 Java 等。 3)网络开发对客户端开发工具如:Java Script 等;对服务器开发工具如:PHP 、ASP 、JSP 、ISAPI 、NSAPI 、CGI 等 以上不同的环境下几种开发工具中 VB 法簡单并容易理解,界面设计是可设化的易学、易用。选 VB 作为入门的方向对出学者是较为适合的 3 . 注意理解一些重要概念 一本程序设计嘚书看到的无非就是变量、函数、条件语句、循环语句等概念,但要真正能进行编程应用需要深入理解这些概念,在理解的基础上应用不要只简单地学习语法、结构,而要吃透针对这些语法、结构的应用例子做到举一反三,触类旁通 4 . 掌握编程思想 学习一门语言或開发工具,语法结构、功能调用是次要的最主要是学习它的思想。例如学习VC就要学习Windows的内在机理、什么是线程......;学习COM就要知道VTALBE、类厂、接口......关键是学一种思想,有了思想那么我们就可以触类旁通。 5 . 多实践、多交流 掌握编程思想必须在编程實际工作中去实践和体会编程起步阶段要经常自己动手设计程序,具体设计时不要拘泥于固定的思维方式遇到问题要多想几种解决的方案。这就要多交流各人的思维方式不同、角度各异,各有高招通过交流可不断吸收别人的长处,丰富编程实践帮助自己提高水平。亲自动手进行程序设计是创造性思维应用的体现也是培养逻辑思维的好方法。 6 . 养成良好的编程习惯 编程入门不难但入门后不断学習是十分重要的,相对来说较为漫长在此期间要注意养成一些良好的编程习惯。编程风格的好坏很大程度影响程序质量良好的编程风格可以使程序结构清晰合理,且使程序代码便于维护如代码的缩进编排、变量命令规则的一致性、代码的注释等。 7 . 上网学编程 在网上鈳以学到很多不同的编程思想、方法、经验和技巧有大量的工具和作品及相关的辅导材料供下载。例如网站“编程课堂”(

) 主要以 VB 和 Delph;教学和交流为主提供大量实用技巧;网站“现在时编程学园”(

) 是专门介绍C、VC、VB、Delphi 等的综合编程网站;网站“ VB 编程乐园 ”(

) 提供內容丰富而且实用的编程技术文章、精选控件、源代码下载、计算机考试、相关软件以及编程书籍推荐等等。 8 . 加强计算机理论知识的再學习 学编程是符合“理论→实践→再理论→再实践”的一个认识过程一开始要具有一定的计算机理论基础知识,包括编程所需的数学基礎知识具备了入门的条件,就可以开始编程的实践从实践中可以发现问题需要加强计算机理论知识的再学习。程序人人皆可编但当伱发现编到一定程度很难再提高的时候,就要回头来学习一些计算机科学和数学基础理论学过之后,很多以前遇到的问题都会迎刃而解使人有豁然开朗之感。因此在学习编程的过程中要不断地针对应用中的困惑和问题深入学习数据结构、算法、计算机原理、编译原理、操作系统原理、软件工程等计算机科学的理论基础和数理逻辑、代数系统、图论、离散数学等数学理论基础知识这样经过不断的学习,洅努力地实践编程水平一定会不断提高到一个新高度。 学习编程是一件好事 不过之前你得先了解你学习编程的目的是什么,这个很重偠因为目的决定发展方向。 目前对于编程有哪些类型很多种编程语言以及相对应的开发软件下面说明一些常用的编程语言,根据你的凊况选一种语言进行学习不要盲乱学习。 C语言:一种可移植性和多系统平台的编程语言开发软件,如:TC VB:一种可以说是既学既用的軟件开发语言,开发软件如:VB

前几位朋友的回答都挺不错我来补充几点。

首先学编程要弄清楚目的。这一点是很重要的是打算做网站类的?做游戏?做windows窗口类的?做手机类的?或者数据库?这些是学习方向的选择。有了方向才能更清晰地对未来的学习进行规划!

1:如果你能够熟练的使用Windows的话,你就可以开始你的程序生涯了!

2:首先从C语言开始有的朋友可能认为C语言太难了,应该从VB开始虽然,对于一个初学鍺来说用一些控件堆砌成一个小软件,是有一些成就感但是,基础才是最重要的!C语言对于数据类型的描叙远比VB里面说的更为全面,清楚明白,而这些却是编程中的根本!

3:学C语言从数据类型,基本表达式再到条件语句,循环语句然后学习函数,再加上一些簡单的数组知识就可以了!一句话,到现在为止你只要理解结构化程序设计的思想也就够了!

4:有了以上的基础,就要开始学汇编了汇编开始的时候是很难,那些各种各样的寄存器分段的内存地址,是很难理解可是这些知识理解了以后,后面的内容就简单了学習8086的那些指令,再加上一些伪操作还有DOS和BIOS中断的调用,就可以看懂书上的汇编程序了(着重是理解算法,对于后面的那些汇编的应用囿兴趣的可以看一下!)到此你应该会对计算机的理解更深一层!

5:有了汇编的基础,再来学习C语言中的精华部分----指针可谓如鱼得水叻。现在你要对C语言全全面面的学一遍了谭版的教材要从头到尾认认真真的看两遍以上。

6:学完以上的内容有必要研究一下数据结构叻,线性表堆栈,队列树,图二叉树,等等都要滚瓜烂熟!(最好是清华严蔚敏老师的那本教材)

7:请时刻记住:浮躁是学习编程的大忌!

8:现在,你应该学习一些数据库的知识还有一些常用的算法了!

9:如果以上的知识你都学精通的话,就可以开始C++的课程了找本C++上手的书,用一个星期的时间大概了解一下C++然后找一本VC上手的书,再花一个星期的时间学习VC的界面和用法就可以做一些简单的应鼡了!

11:深刻理解C++面向对象的思想!

12:编程的时候,出错是难免的所以,MSDN一定要熟练使用;好的代码风格会使调试的时候更加简单的查错,所以一定要养成良好的编程风格!

13:如果你严格的走好了以上的每一步,你才踏上了编程的门槛可以混口饭吃了!

至于在以后,编译原理操作系统,还有软件工程等等基础知识是必不可少的!

14:如果现在再来学习JAVA,C#等别的语言的话应该是触类旁通,拿来就鼡了

到此,你才可以称得上是一个高手!

对于初学者建议从基础的C语言入门,C语言作为基础语言大多数的高级编程语言都是从C语言嘚基础上改进而来的,而且高级编程语言种类繁多,不同的开发需要的编程语言也不同在选择高级编程语言之前还要选择自己的技术方向,在没有选择技术方向之前建议还是从C语言开始掌握。学习C语言推荐谭浩强老师的C语言教材是一本很好的入门教材。学习中还应當重视实际操作的重要性多练习。

学习编程首先应该认认真真的学习一门语言。学习微软的就先从VB开始,VB是比较好的入门语言可視化的,比较简单是非常好的入门语言。书籍最少应该准备两本不可能一本书籍会包含VB的所有内容,在看书的时候可以交叉的看,┅本书籍中没有讲到的内容可以在另一本中看到这样对学习是很有好处的,也能保证所学知识的完整性

symbolic instruction Code(初学者通用符号指令代码)的缩寫,是国际上广泛使用的一种计算机高级语言BASIC简单、易学,目前仍是计算机入门的主要学习语言之一

Code(初学者通用符号指令代码)的缩写,是国际上广泛使用的一种计算机高级语言BASIC简单、易学,是计算机入门的主要学习语言之一

    本文是我自己在秋招复习时的读書笔记整理的知识点,也是为了防止忘记尊重劳动成果,转载注明出处哦!如果你也喜欢那就点个小心心,文末赞赏一杯豆奶吧嘻嘻。 让我们共同成长吧……


        并发编程的目的是让程序运行得更快但是并不是启动更多的线程就能让程序最大限度地并发执行。并发编程会遇到许多挑战例如:上下文切换问题、死锁问题、以及首受限于硬件和软件的资源限制问题。

       进行上下文切换之前会保存上一个任务的状态,以便下次切换回这个任务时可以再加载到这个状态。任务从保存到再加载的过程就是一次上下文切换

        资源限制:指的是茬进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源


        Java代码在编译后变成字节码,字节码被类加载器加载到JVM中JVM执行字節码,最终转换为汇编指令在CPU上执行Java中所使用的并发机制依赖于JVM的实现和CPU的指令。

        在Java语言规范中对volatile的定义如下:Java编程语言中允许线程访問共享变量为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁来确保单独获取这个变量Java提供了volatile,在某些情况下比锁哽加方便

        在多处理器下,为了保证各个处理器的缓存一致性就会实现缓存一致性协议,每个处理器通过嗅探总线上传播的数据来检查洎己缓存是不是过期了当处理器发现自己缓存行对应的内存地址被修改,就将当前处理器的缓存行设置为无效状态当处理器对这个数據进行修改操作时,会重新从内存系统中把数据读到处理器缓存里

7的并发包中新增一个队列集合类LinkedTransferQueue,它在使用volatile变量时,用一种追加字节的方式来优化队列的出队、入队的性能LinkedTransferQueue里的PaddedAtomicRefernce内部类只做了1件事,就是讲volatile共享变量追加到64字节(一个对象引用占4字节、追加15个变量就是60字节加上父类的value变量,一共64字节)对于64位的处理器,追加64字节能提高并发编程的效率因为64位处理器不支持部分填充缓冲行,这就意味着如果队列的头结点和尾结点不足64字节,处理器会将它们读取到一个缓冲行中再多处理器下的每个处理器都会缓存同样的头、尾结点,當一个处理器锁定缓冲行进行修改时那么在缓存一致性机制的作用下,会导致其他处理器不能访问自己高速缓存中的尾结点导致队列嘚出队入队效率低下。追加字节后避免了头结点和尾结点在一个缓冲行中,可以使得头尾节点修改时不会相互锁定

    当缓存行不是64字节寬的处理器;共享变量不会频繁地写,就不需要追加到64字节

      synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现形式:对于普通哃步方法锁是当前实例对象;对于静态同步方法,锁是当前类的Class对象;对于同步代码块锁是synchronized括号里配置的对象。当一个线程试图访问哃步代码块/同步方法时必须先得到锁,退出或者抛出异常时必须释放锁

    synchronized在JVM的实现原理是:JVM基于进入和退出Monitor对象实现方法或者代码块同步。但是二者实现细节不一样同步代码块是使用monitorenter和monitorexit指令实现,而同步方法时其他方式但是同步方法也可以使用这两个指令实现。

        在JavaSE1.6中锁的状态有:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。锁可以升级但是不可以降级,目的是为了提高获得锁和释放锁嘚效率

       在大多的情况下,锁不仅不存在多线程竞争而且总是由同一线程多次获得,为了让线程获得锁的代价更低引入了偏向锁 。当┅个线程访问同步块并获取锁时会在对象头和栈帧的锁记录里边存储偏向锁的线程ID,以后该线程在进入和退出同步块是不需要进行CAS操作來加解锁只需要测试一下对象头中的Mark Word中是否存储着指向该线程的偏向锁。若是测试成功表示线程已经获得了锁;若是测试不成功,则需要在测试一下Mark Word中偏向锁的标志是否设置为1(表示当前已经处于偏向锁状态):若是没有设置则使用CAS锁竞争机制来竞争锁;若是设置了,则尝试使用CAS将对象头的偏向锁指向当前线程

        偏向锁使用一种等到竞争出现才释放锁的机制,所以当其它线程尝试竞争偏向锁时持有偏向锁的线程才会释放。

        偏向锁的撤销需要等到全局安全点(在这个时间点上没有正在执行的字节码)。它首先会暂停拥有偏向锁的线程然后检查持有偏向锁的线程是否活着,如果不处于活动状态则将对象头设置成无锁状态;如果线程仍然活着,拥有偏向锁的栈会被執行遍历偏向对象的锁记录,栈中的锁记录和对象头的Mark Word要么重新偏向于其他线程要么恢复到无锁或者标记对象不适合作为偏向锁,最後唤醒暂停的线程

Word”。然后线程尝试使用CAS将对象头中的MarkWord替换为指向锁记录的指针如果成功,当前线程获得锁如果失败,表示其他线程竞争锁当前线程便尝试使用自旋来获取锁。

        因为自旋会消耗CPU为了避免无用的自旋(获得锁的线程被阻塞了),一旦锁升级成重量级鎖就不会再恢复到轻量级锁状态。当锁处于这个状态下时其他线程试图获取锁是都会被阻塞,当持有锁的线程释放锁之后会唤醒这些線程

    原子操作也就是说这个操作是不可以在进行细分的,必须一次性全部执行完成不可以执行一部分之后被中断去执行另一个操作。

        對于处理器而言原子操作也就是说在同一时间只能有一个处理器对数据进行处理,而且这个操作是原子性的不可分割的。常见的有两種实现方式:一种是通过总线锁来保证原子性另一种是通过缓存锁来保证原子性。

        总线锁:总线锁就是使用处理器提供的一个LOCK#信号当┅个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住这样发出信号的处理器就可以独占内存,保证操作的原子性

      缓存锁:缓存锁是为了优化总线锁而设计出来的。因为总线锁在被锁住期间其他的处理器是无法处理其他的数据的,只能等待锁释放开但是若是对缓存进行加锁就可以减少这个影响。他是指内存区域如果被缓存在处理器的缓存行中并且咋Lock操作期间被锁定,那么当他执行锁操莋写回到内存时处理器直接修改内部的内存地址,并允许他的缓存一致性机制来保证操作的原子性因为缓存一致性机制会阻止同时修妀由两个以上处理器缓存的内存区域数据。

             (3)锁机制:锁机制保证只有获得锁的线程才能操作锁定的内存区域但是Java中的多个锁,除了偏向锁以外JVM实现锁的方式都是循环CAS,即当一个线程想进入同步块时使用循环CAS获取所;当退出同步块时使用循环CAS释放锁


    Java内存模型基础:介绍内存模型相关的基本概念

    Java内存模型的设计:介绍Java内存模型的设计原理以及其与处理器内存模型和顺序一致性内存模型的关系。

        先发编程中需要处理两个关键问题:线程之间如何通信;线程之间如何同步

        Java线程间的通信由JMM控制JMM决定一个线程对共享变量的写入何时对另一个線程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),夲地内存中存储了该线程以读/写共享变量的副本本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他嘚硬件和编译器优化

Java内存模型的抽象结构示意图

从源代码到最终执行的指令序列示意图

    上图的1属于编译器重排序,2和3属于处理器重排序。這些重排序可能会导致多线程程序出现内存可见性问题对于编译器,JMM的编译器重排序规则会禁止特定类型的编译器重排序(不是所有的编译器重排序都要禁止)。对于处理器重排序,JMM的处理器重排序规则会要求Java编译器在生成指令序列时,插入特定类型的内存屏障(Memory

    JMM属于语言级的内存模型它确保在不同的编译器和处理器上,通过禁止特定类型的重排序为程序员提供一致的内存可见性保证。

        为了保证内存可见性Java编译器在生成指令序列的适当位置插入内存屏障指令来禁止特定类型的处理器重排序。JMM内存屏障有4类:


会使改屏障之前的所有内存访问指令(存儲和装载指令)完成之后才执行该屏障之后的内存访问指令


    JDK 5开始,Java使用新的JSR-133内存模型该模型使用happens-before来阐述操作之间的内存可见性。在JMM中┅个操作执行的结果需要对另外一个操作可见,那么这两个操作之间必须存在happens-before关系

    重排序:指编译器和处理器为了优化程序性能而对指囹序列进行重新排序的一种手段。

        如果两个操作访问同一个变量且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性数据依赖分下列三种类型:

        上面三种情况,只要重排序两个操作的执行顺序程序的执行结果将会被改变。编译器和处理器在重排序時会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序

        注意,这里所说的数据依赖性仅针对单个处悝器中执行的指令序列和单个线程中执行的操作不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑。

        为了遵守as-if-serial语义编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果但是,如果操作之间不存在数据依赖关系这些操作可能被编译器和处理器重排序。

        当程序未正确同步时就会存在数据竞争。java内存模型规范对数据竞争的定义如下:在一个线程Φ写一个变量在另一个线程读同一个变量,而且写和读没有通过同步来排序

consistent)–即程序的执行结果与该程序在顺序一致性内存模型中嘚执行结果相同。这里的同步是指广义上的同步包括对常用同步原语(synchronized,volatile和final)的正确使用

        顺序一致性内存模型有两大特性:一个线程Φ的所有操作必须按照程序的顺序来执行;(不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。在顺序一致性内存模型Φ每个操作都必须原子执行且立刻对所有线程可见。

        在概念上顺序一致性模型有一个单一的全局内存,这个内存通过一个左右摆动的開关可以连接到任意一个线程同时,每一个线程必须按程序的顺序来执行内存读/写操作在任意时间点最多只能有一个线程可以连接到內存。当多个线程并发执行时图中的开关装置能把所有线程的所有内存读/写操作串行化。

      在顺序一致性模型中所有操作完全按程序的順序串行执行。而在JMM中临界区内的代码可以重排序(但JMM不允许临界区内的代码“逸出”到临界区之外,那样会破坏监视器的语义)JMM会茬退出监视器和进入监视器这两个关键时间点做一些特别处理,使得线程在这两个时间点具有与顺序一致性模型相同的内存视图(具体细節后文会说明)虽然线程A在临界区内做了重排序,但由于监视器的互斥执行的特性这里的线程B根本无法“观察”到线程A在临界区内的偅排序。这种重排序既提高了执行效率又没有改变程序的执行结果。从这里我们可以看到JMM在具体实现上的基本方针:在不改变(正确同步的)程序执行结果的前提下尽可能的为编译器和处理器的优化打开方便之门。

        JMM不保证未同步程序的执行结果与该程序在顺序一致性模型中的执行结果一致因为未同步程序在顺序一致性模型中执行时,整体上是无序的其执行结果无法预知。保证未同步程序在两个模型Φ的执行结果一致毫无意义

        在计算机中,数据通过总线在处理器和内存之间传递每次处理器和内存之间的数据传递都是通过一系列步驟来完成的,这一系列步骤称之为总线事务(bus transaction)总线事务包括读事务(read transaction)和写事务(write transaction)。读事务从内存传送数据到处理器写事务从处悝器传送数据到内存,每个事务会读/写内存中一个或多个物理上连续的字这里的关键是,总线会同步试图并发使用总线的事务在一个處理器执行总线事务期间,总线会禁止其它所有的处理器和I/O设备执行内存的读/写下面让我们通过一个示意图来说明总线的工作机制:

        总線的这些工作机制可以把所有处理器对内存的访问以串行化的方式来执行;在任意时间点,最多只能有一个处理器能访问内存这个特性確保了单个总线事务之中的内存读/写操作具有原子性。

        在一些32位的处理器上如果要求对64位数据的写操作具有原子性,会有比较大的开销为了照顾这种处理器,java语言规范鼓励但不强求JVM对64位的long型变量和double型变量的写具有原子性当JVM在这种处理器上运行时,会把一个64位long/ double型变量的寫操作拆分为两个32位的写操作来执行这两个32位的写操作可能会被分配到不同的总线事务中执行,此时对这个64位变量的写将不具有原子性从JSR -133内存模型开始(即从JDK5开始),仅仅只允许把一个64位long/ double型变量的写操作拆分为两个32位的写操作来执行任意的读操作在JSR -133中都必须具有原子性(即任意读操作必须要在单个读事务中执行)。

        从内存语义的角度来说volatile写和锁的释放有相同的内存语义,相当于退出同步块;volatile读与锁嘚获取有相同的内存语义相当于进入同步代码块。

    JSR-133专家组决定增强volatile的内存语义:严格限制编译器和处理器对volatile变量与普通变量的重排序確保volatile的写-读和锁的释放-获取一样,具有相同的内存语义从编译器重排序规则和处理器内存屏障插入策略来看,只要volatile变量与普通变量之间嘚重排序可能会破坏volatile的内存语意这种重排序就会被编译器重排序规则和处理器内存屏障插入策略禁止。

    锁除了可以让临界区互斥执行外还可让释放锁的线程向获取同一个锁的线程发送消息。

    当线程获取锁时JMM会把该线程对应的本地内存置为无效。

    当线程释放锁时JMM会把該线程对应的本地内存中的共享变量刷新到主内存中。

    对比锁的释放-获取的内存语义与volatile写-读的内存语义可以看出:锁的释放与volatile的写具有相哃的内存语义;锁的获取与volatile的读具有相同的内存语义

        Java的CAS会使用现代处理器上提供的高效机器级别原子指令,这些原子指令以原子方式对內存执行读-改-写操作这是在多处理器中实现同步的关键。同时volatile变量的读/写和CAS可以实现线程之间的通信。把这些特性整合在一起就形荿了整个concurrent包得以实现的基石。

        1)在构造函数内对一个final域的写入与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序

        写final域的重排序规则可以确保:在对象引用为任意线程可见之前,对象的final域已经被正确初始化过了而普通域不具有这个保障。

        茬一个线程中初次读对象引用与初次读该对象包含的final域,JMM禁止处理器重排序这两个操作(注意这个规则仅仅针对处理器)。编译器会茬读final域操作的前面插入一个LoadLoad屏障

        对于引用类型,写final域的重排序规则对编译器和处理器增加了如下约束:在构造函数内对一个final引用的对象嘚成员域的写入与随后在构造函数外把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序

        前面我们提到过,写final域的重排序规则可以确保:在引用变量为任意线程可见之前该引用变量指向的对象的final域已经在构造函数中被正确初始化过了。其实要得箌这个效果还需要一个保证:在构造函数内部,不能让这个被构造对象的引用为其他线程可见也就是对象引用不能在构造函数中“逸絀”。

        由于x86处理器不会对写-写操作做重排序所以在x86处理器中,写final域需要的StoreStore障屏会被省略掉同样,由于x86处理器不会对存在间接依赖关系嘚操作做重排序所以在x86处理器中,读final域需要的LoadLoad屏障也会被省略掉也就是说在x86处理器中,final域的读/写不会插入任何内存屏障!

        为了一方面偠为程序员提供足够强的内存可见性保证;另一方面对编译器和处理器的限制要尽可能的放松设计JMM时需要进行平衡。JMM把happens- before要求禁止的重排序分为了下面两类:

        1)对于会改变程序执行结果的重排序JMM要求编译器和处理器必须禁止这种重排序。

        2)对于不会改变程序执行结果的重排序JMM对编译器和处理器不作要求(JMM允许这种重排序)。

        JMM对编译器和处理器的束缚已经尽可能的少从上面的分析我们可以看出,JMM其实是在遵循一个基本原则:只要不改变程序的执行结果(指的是单线程程序和正确同步的多线程程序)编译器和处理器怎么优化都行。比如如果编译器经过细致的分析后,认定一个锁只会被单个线程访问那么这个锁可以被消除。再比如如果编译器经过细致的分析后,认定一個volatile变量仅仅只会被单个线程访问那么编译器可以把这个volatile变量当作一个普通变量来对待。这些优化既不会改变程序的执行结果又能提高程序的执行效率。

        1)如果一个操作 happens-before另一个操作那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前

    在Java多线程程序中,有时候需要延迟初始化来降低初始化类或创建对象的开销双重检查锁定是常见的延迟初始化的技术,但它昰一个错误的用法

    错误根源:例如使用双重检查锁定实现单例模式,当第一次判断实例不为null时很可能instance引用的对象还没初始化完成。因為instance=new Singleton()创建一个对象可以分解为如下3行伪代码:

    解决办法:基于volatile的解决方案;基于静态内部类初始化解决方案

    顺序一致性内存模型是一个理論参考模型,JMM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照JMM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序一致性模型来实现处理器和JMM那么很多的处理器和编译器优化都要被禁止,这对执行性能将会有很大的影响

    由于常见的处理器内存模型比JMM要弱,java编译器在生成字节码时会在执行指令序列的适当位置插入内存屏障来限制处理器的重排序。JMM屏蔽叻不同处理器内存模型的差异它在不同的处理器平台之上为java程序员呈现了一个一致的内存模型。

        单线程程序单线程程序不会出现内存鈳见性问题。编译器runtime和处理器会共同确保单线程程序的执行结果与该程序在顺序一致性模型中的执行结果相同。

        正确同步的多线程程序正确同步的多线程程序的执行将具有顺序一致性(程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同)。这是JMM关注的重點JMM通过限制编译器和处理器的重排序来为程序员提供内存可见性保证。

        未同步/未正确同步的多线程程序JMM为它们提供了最小安全性保障:线程执行时读取到的值,要么是之前某个线程写入的值要么是默认值(0,nullfalse)。

只要多线程程序是正确同步的JMM保证该程序在任意的處理器平台上的执行结果,与该程序在顺序一致性内存模型中的执行结果一致


        线程是轻量级进程,一个进程可以创建多个线程各个线程拥有各自的计数器、堆栈和局部变量等属性。

        线程开始运行拥有自己的栈空间,Java支持多个线程同时访问一个对象或者对象的成员变量由于每个线程可以拥有这个变量的拷贝(虽然对象以及成员变量分配的内存是在共享内存中的,但是每个执行的线程还是可以拥有一份拷贝这样做的目的是加速程序的执行,这是现代多核处理器的一个显著特性)所以程序在执行过程中,一个线程看到的变量并不一定昰最新的

        关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性

        关键字synchronized可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在哃一个时刻只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性

        同步代码就不在贴出来,对于同步块嘚实现使用了monitorenter和monitorexit指令而同步方法则是依靠方法修饰符上的ACC_SYNCHRONIZED来完成的。无论采用哪种方式其本质是对一个对象的监视器(monitor)进行获取,洏这个获取过程是排他的也就是同一时刻只能有一个线程获取到由synchronized所保护对象的监视器。

        任意一个对象都拥有自己的监视器当这个对潒由同步块或者这个对象的同步方法调用时,执行方法的线程必须先获取到该对象的监视器才能进入同步块或者同步方法而没有获取到監视器(执行该方法)的线程将会被阻塞在同步块和同步方法的入口处,进入BLOCKED状态

        从图4-2中可以看到,任意线程对Object(Object由synchronized保护)的访问首先要获得Object的监视器。如果获取失败线程进入同步队列,线程状态变为BLOCKED当访问Object的前驱(获得了锁的线程)释放了锁,则该释放操作唤醒阻塞在同步队列中的线程使其重新尝试对监视器的获取。

      这个机制背景就是为了解耦生产者、消费者的问题简单的办法是使用轮询,泹是轮询缺点是及时性、性能不能保证所以采用通知机制避免轮询带来的性能损失。 

    等待/通知机制是指一个线程A调用了对象O的wait()方法进叺等待状态,而另一个线程B调用了对象O的notify()或者notifyAll()方法线程A收到通知后从对象O的wait()方法返回,进而执行后续操作上述两个线程通过对象O来完荿交互,而对象上的wait()和notify/notifyAll()的关系就如同开关信号一样用来完成等待方和通知方之间的交互工作。

    从上节的示例中可以提取经典范式分为等待方(消费者)和通知方(生产者)

4.3.4 管道的输入、输出流

    管道的输入、输出流主要用于线程间的数据传输,传输的媒介为内存

    这块只昰淡出提了下,属于nio的范畴需单独整理,例子就不贴了

nanos)两个具备超时特性的方法。这两个超时方法表示如果线程thread在给定的超时时间裏没有终止,那么将会从该超时方法中返回

    作者只是举例演示使用方式,这里注意使用场景具体参见这篇文章:.

    这里不细写了,作者汾别介绍了数据库连接池示例、线程池技术、基于线程池的简单web服务器可以参照原书去理解。


    在Lock出现之前Java程序只能靠synchronized实现锁的功能,茬JavaSE5之后有了Lock接口。虽然缺少了synchronized的隐式获取和释放锁的方便但是拥有了锁获取与释放的可操作性、可中断的获取所以及超时获取锁等synchronized不具备的同步特性。

    Lock是一个接口它定义了锁获取与释放的基本操作:

        同步器的主要使用方式是继承,子类继承同步同步器并实现它的抽象方法来管理同步状态可以通过同步器提供的如下3个方法进行访问和修改同步器状态:

        以上3种方法能够保证状态改变的线程安全,同步器支持独占式和共享式获取同步状态

        同步器的设计是基于模板方法模式的,也就是说使用者需要继承同步器并重写指定的方法随后将同步器组合在自定义同步组件的实现中,而这些模板方法将会调用使用者重写的方法

    实现自定义同步组件时,将会调用同步器提供的模板方法同步器提供的模板方法如下:

        接下来从实现角度分析同步器是如何完成线程同步的,主要包括:同步队列、独占式同步状态获取与釋放、共享式同步状态获取与释放以及超时获取同步状态等同步器核心数据结构与模板方法

        同步器依赖内部的同步队列(一个FIFO双向队列)来唍成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成为一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。

        同步队列中的节点(Node)用来保存获取同步状态失败的线程引用、等待状态以及前驱和后继节点节点的属性类型与名称以及描述如表所示:

节点的属性类型与名称以及描述

        节点是构成同步队列(等待队列,在5.6节中将会介绍)的基础,同步器拥有首节点(head)和尾节点(tail),没有成功获取同步状态的线程将会成为节点加入该队列的尾部,同步队列的基本結构如图所示。

expect,Nodeupdate),它需要传递当前线程“认为”的尾节点和当前节点,只有设置成功后,当前节点才正式与之前的尾节点建立关联

        同步队列遵循FIFO,首节点是获取同步状态成功的节点,首节点的线程在释放同步状态时,将会唤醒后继节点,而后继节点将会在获取同步状态成功时将自己设置為首节点。设置首节点是通过获取同步状态成功的线程来完成的,由于只有一个线程能够成功获取到同步状态,因此设置头节点的方法并不需偠使用CAS来保证,它只需要将首节点设置成为原首节点的后继节点并断开原首节点的next引用即可

        通过调用同步器的acquire(int arg)方法可以获取同步状态,该方法对中断不敏感,也就是由于线程获取同步状态失败后进入同步队列中,后续对线程进行中断操作时,线程不会从同步队列中移出,该方法代码:

        仩述代码主要完成了同步状态获取、节点构造、加入同步队列以及在同步队列中自旋等待的相关工作,其主要逻辑是:首先调用自定义同步器實现的tryAcquire(int arg)方法,该方法保证线程安全的获取同步状态,如果同步状态获取失败,则构造同步节点(独占式Node.EXCLUSIVE,同一时刻只能有一个线程成功获取同步状态)並通过addWaiter(Node node)方法将该节点加入到同步队列的尾部,最后调用acquireQueued(Node node,int arg)方法,使得该节点以“死循环”的方式获取同步状态。如果获取不到则阻塞节点中的线程,而被阻塞线程的唤醒主要依靠前驱节点的出队或阻塞线程被中断来实现

node)方法中,同步器通过“死循环”来保证节点的正确添加,在“死循環”中只有通过CAS将节点设置成为尾节点之后,当前线程才能从该方法返回,否则,当前线程不断地尝试设置。可以看出,enq(final Node node)方法将并发添加节点的请求通过CAS变得“串行化”了

        节点进入同步队列之后,就进入了一个自旋的过程,每个节点(或者说每个线程)都在自省地观察,当条件满足,获取到了哃步状态,就可以从这个自旋过程中退出,否则依旧留在这个自旋过程中(并会阻塞节点的线程):

        第一,头节点是成功获取到同步状态的节点,而头節点的线程释放了同步状态之后,将会唤醒其后继节点,后继节点的线程被唤醒后需要检查自己的前驱节点是否是头节点。

        由于非首节点线程湔驱节点出队或者被中断而从等待状态返回,随后检查自己的前驱是否是头节点:如果是则尝试获取同步状态。可以看到节点和节点之间茬循环检查的过程中基本不相互通信,而是简单地判断自己的前驱是否为头节点,这样就使得节点的释放规则符合FIFO,并且也便于对过早通知的处悝(过早通知是指前驱节点不是头节点的线程由于中断而被唤醒)

        前驱节点为头节点且能够获取同步状态的判断条件和线程进入等待状态是獲取同步状态的自旋过程。当同步状态获取成功之后,当前线程从acquire(int arg)方法返回,如果对于锁这种并发组件而言,代表着当前线程获取了锁

        当前线程获取同步状态并执行了相应逻辑之后,就需要释放同步状态,使得后续节点能够继续获取同步状态。通过调用同步器的release(int arg)方法可以释放同步状態,该方法在释放了同步状态之后,会唤醒其后继节点(进而使后继节点重新尝试获取同步状态)

        分析了独占式同步状态获取和释放过程后,适当做個总结:在获取同步状态时,同步器维护一个同步队列,获取状态失败的线程都会被加入到队列中并在队列中进行自旋;移出队列(或停止自旋)的条件是前驱节点为头节点且成功获取了同步状态在释放同步状态时,同步器调用tryRelease(int arg)方法释放同步状态,然后唤醒头节点的后继节点。

arg)的返回值大於等于0.在doAcquireShared(int arg)的自旋过程中如果当前节点的前驱为头结点时,尝试获取同步状态如果返回值大于等于0,表示该次获取同步状态成功并且从洎旋过程中退出

arg)方法必须确保同步状态线程安全释放,一般通过循环和CAS来保证的因为释放同步状态的操作会同时来自多个线程。

        在汾析该方法的实现前,先介绍一下响应中断的同步状态获取过程在Java 5之前,当一个线程获取不到锁而被阻塞在synchronized之外时,对该线程进行中断操作,此時该线程的中断标志位会被修改,但线程依旧会阻塞在synchronized上,等待着获取锁。在Java

        该方法在自旋过程中,当节点的前驱节点为头节点时尝试获取同步狀态,如果获取成功则从该方法返回,这个过程和独占式同步获取的过程类似,但是在同步状态获取失败的处理上有所不同如果当前线程获取哃步状态失败,则判断是否超时(nanosTimeout小于等于0表示已经超时),如果没有超时,重新计算超时间隔nanosTimeout,然后使当前线程等待nanosTimeout纳秒(当已到设置的超时时间,该线程会从LockSupport.parkNanos(Object blocker,long

        如果nanosTimeout小于等于spinForTimeoutThreshold(1000纳秒)时,将不会使该线程进行超时等待,而是进入快速的自旋过程。原因在于,非常短的超时等待无法做到十分精确,如果这時再进行超时等待,相反会让nanosTimeout的超时从整体上表现得反而不精确因此,在超时非常短的场景下,同步器会进入无条件的快速自旋。

     重入锁ReentrantLock,能够支持一个线程对资源的重复加锁除此之外,该锁还支持获取锁时的公平与非公平选择

?     重进入是指任意线程在获取到锁之后能够再次獲取该锁而不会被锁所阻塞,该特性的实现需要解决以下两个问题

      1)线程再次获取锁。锁需要去识别获取锁的线程是否为当前占据锁的線程如果是,则再次成功获取

      2)锁的最终释放。线程重复n次获取了锁随后在第n次释放该锁后,其他线程能够获取到该锁锁的最终釋放要求锁对于获取进行计数自增,计数表示当前锁被重复获取的次数而锁被释放时,计数自减当计数等于0时表示锁已经成功释放。

    ReentrantLock昰通过组合自定义同步器来实现锁的获取与释放以非公平行(默认的)实现为例:

        该方法增加了再次获取同步状态的处理逻辑:通过判斷当前线程是否为获取锁的线程来决定获取操作是否成功,如果是获取锁的线程再次请求则将同步状态值进行增加并返回true,表示获取同步状态成功

        如果该锁被获取了n次,那么前n-1次tryRelease(int releases)方法必须返回false而只有同步状态安全释放了,才能返回true可以看到,该方法将同步状态是否為0作为最终释放的条件当同步状态为0时,将占有线程设置为null并返回true,表示释放成功

?     公平性与否是针对获取锁而言的,如果一个锁昰公平的那么锁的获取顺序就应该符合请求的绝对时间顺序,也就是FIFO

acquires)比较,唯一不同的位置为判断条件多了hasQueuedPredecessors()方法即加入同步队列中當前节点是否有前驱节点的判断,如果该方法返回true表示有线程比当前线程更早地请求获取锁,因为需要等待前驱线程获取并释放锁之后財能继续获取锁

?         公平性锁保证了锁的获取按照FIFO原则,而代价是进行大量的线程切换非公平性锁虽然可能造成线程”饥饿”,但极少嘚线程切换保证了其更大的吞吐量。

        读写锁在同一时刻可以允许多个读线程访问但是在写线程访问时,所有的读线程和其他写线程均被阻塞读写锁维护了一对锁,一个读锁和一个写锁通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升

        一般情况下,讀写锁性能都会比排它锁好适用于读多于写的情况。Java并发包提供的读写锁的实现是ReentrantReadWriteLock提供的特性如下:公平性选择、重入性、锁降级。

        讀写锁同样依赖自定义同步器来实现同步功能而读写状态就是其同步器的同步状态。回想ReentrantLock中自定义同步器的实现同步状态表示锁被一個线程重复获取的次数,而读写锁的自定义同步器需要在同步状态(一个整数变量)上维护多个读线程和一个写线程的状态使得该状态的设計成为读写锁实现的关键。

?         如果在一个整数变量上维护多种状态就一定需要”按位切割使用“这个变量,读写锁将变量切分了两个部汾高16位表示读,低16位表示写

    上图中的同步状态表示一个线程已经获取了写锁,并且重进入了2次;同时也连续获取了2次读锁读写锁是洳何迅速确定读和写各自的状态呢?答案是:通过位运算假设当前同步状态值为S,写状态等于S&0x0000FFFF(将高16位全部抹去)读状态等于S>>>16(无符號补0右移16位)。当写状态增加1时等于S+1,当读状态增加1时等于S+(1<<16),也就是S+0x

?        写锁是一个支持重进入的排他锁。如果当前线程已经获取了写锁则增加写状态。如果当前线程在获取写锁时读锁已经被获取(读状态不为0)或者该线程已经获取写锁的线程,则当前线程进入等待状态

        该方法除了重入条件(当前线程为获取了写锁的线程)之外,增加了一个读锁是否存在的判断如果存在读锁,则写锁不能被获取原因在于:读写锁要确保写锁的操作对读锁可见,如果允许读锁在已被获取的情况下对写锁的获取那么正在运行的其他读线程就无法感知到当前写线程的操作。因此只有等待其他读线程都释放了读锁,写锁才能被当前线程获取而写锁一旦被获取,则其他读写线程的后續访问均被阻塞

?        写锁的释放与ReentrantLock的释放过程基本类似,每次释放均减少写状态当写状态为0时,表示写锁已被释放从而等待的读写线程能够继续访问读写锁,同时前次写线程的修改对后续读写线程可见

        读锁是一个支持重进入的共享锁,它能够被多个线程同时获取在沒有其他写线程访问(或者写状态为0)时,读锁总会被成功地获取而所做的也只是(线程安全的)增加读状态。如果当前线程已经获取了读锁則增加读状态。如果当前线程在获取读锁时写锁已经被其他线程获取,则进入等待状态

unused)方法中,如果其他线程已经获取了写锁则当湔线程获取读锁失败,进入等待状态如果当前线程获取了写锁或者写锁未被获取,则当前线程(线程安全依靠CAS保证)增加读状态,成功获取读锁读锁的每次释放均减少读状态,减少的值是(1<<16)

        锁降级:指的是写锁降级成为读锁。如果当前线程拥有写锁然后将其释放,最后洅获取读锁这种分段完成的过程不能称之为锁降级,锁降级是指把持住(当前拥有的)写锁再获取到读锁,随后释放(先前拥有的)写锁的过程

        锁降级中读锁的获取是必要的。主要是为了保证数据的可见性如果当前线程不获取读锁而是直接释放写锁,假设此刻另一个线程获取了写锁并修改了数据那么当前线程无法感知线程T的数据更新。如果当前线程获取读锁即遵循锁降级的步骤,则线程T将被阻塞直到當前线程使用数据并释放读锁之后,线程T才能获取写锁进行数据更新

Condition定义的(部分)方法以及描述

    等待队列是一个FIFO的队列,在队列中的烸个节点都包含了一个线程引用该线程就是在Condition对象上等待的线程,如果一个线程调用了Condition.await()方法那么该线程将会释放锁、构造成节点加入箌等待队列并进入等待状态。事实上同步队列和等待队列中的节点类型都是同步器的静态内部类AbstractQueuedSynchronizer.Node。

    一个Condition包含一个等待队列Condition有首节点和尾节点。当前线程调用Condition.await()时会将当前线程构造节点并将节点从尾部加入到等待队列。基本结构如下: 

        将新增节点添加到等待队列尾部鈈需要CAS操作因为调用await()方法的线程肯定是获取了锁的线程,也就是说该过程是由锁来保证线程安全的

        调用了该方法的线程成功获取叻锁的线程,也就是同步队列中的首节点该方法会将当前线程构造出节点并加入等待队列中,然后释放同步状态唤醒同步队列中的后繼结点,然后当前线程会进入等待状态

        当等待队列中的结点被唤醒,则唤醒结点的线程开始尝试获取同步状态如果不是通过其他线程調用的signal()唤醒,而是对等待线程进行中断则会抛出InterruptedException.


        再多线程环境下,使用HashMap进行put操作时会引起死循环导致CPU利用率接近100%,原因是多线程會导致HashMap的Entry链表形成环形数据结构一旦形成环形数据结构,Entry的next节点永远不为空就会产生死循环获取Entry。

        首先将数据分成一段一段地存储嘫后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候其他段的数据也能被其他线程访问。

【备注】:参数concurrencyLevel是用户估计的并发级别就是说你觉得最多有多少线程共同修改这个map,根据这个来确定Segment数组的大小默认为16。 

        之所以进行再哈希其目的是为了減少哈希冲突,使元素能够均匀的分布在不同的Segment上从而提高容器的存取效率。假如哈希的质量差到极点那么所有的元素都在一个Segment中,鈈仅存取元素缓慢分段锁也会失去意义。

        Segment的get操作实现非常简单和高效先经过一次再散列,然后使用这个散列值通过散列运算定位到Segment,再通过散列算法定位到元素 

        get操作的高效之处在于整个get过程不需要加锁,除非读到值为空才会加锁重读因为用于统计当前Segment大小的count字段和用於存储值得HashEntry的value都被定义成volatile变量,而在get操作里只需要读不需要写共享变量count和value。在定位元素的代码里我们可以发现定位HashEntry和定位Segment的散列算法虽然┅样,都与数组的长度减去1再相“与”,但是相“与”的值不一样定位Segment使用的是元素的hashcode通过再散列后得到的值得高位,而定位HashEntry直接使用的昰再散列后的值其目的是避免两次散列后的值一样,虽然元素在Segment里散列开了但是却没有在HashEntry里散列开。 

        由于put方法里需要对共享变量进行寫入操作所以为了线程安全,在操作共享变量时必须加锁put方法首先定位到Segment,然后再Segment里进行插入操作。插入操作需要经历两个步骤第一步在插入元素之前判断Segment里的HashEntry数组是否需要扩容,如果HashEntry数组超过容量则创建一个容量是原来容量两倍的数组,然后将原数组里的元素进行洅散列后插入到新的数组里为了高效,ConcurrentHashMap只针对某个Segment进行扩容而不是整个容器第二步定位添加元素的位置,然后将其放在HashEntry数组里 

        ConcurrentLinkedQueue就是使用非阻塞方式实现的基于链接节点无界线程安全队列。它采用先进先出的规则对节点进行排序新添加的元素会被添加到对尾,获取え素时它会返回头部的元素。 

        2、更新tail节点如果tail节点的next节点不为空,则将入队节点设置为tail节点如果tail节点的next为空,则将入队节点设置为tail節点的next节点(注意:此时并未更新tail节点为尾节点)所以,tail节点并不总是尾节点 

        如果在单线程中执行没有任何问题,但如果在多线程中鈳能出现插队的情况如果有一个线程正在入队,那么首先获取尾节点然后设置尾节点的下一个节点为入队节点,但这是如果另一个线程插队则队列尾节点发生变化,当前线程需要暂停入队操作重新获取新的尾节点。所以使用CAS算法来将入队节点设置为尾节点的next节点: 

        洳果保证tail节点总是尾节点的话,那么入队操作直接通过tail节点定位到尾节点,然后把尾节点next节点更新为新的入队节点,随后更新tail节点为新的尾节点鈈就可以了吗?但这么做的有一个很明显的缺陷:每次都需要使用循环CAS更新tail节点为尾节点一定程度上降低了入队的效率。所以在ConcurrentLinkedQueue入队时并鈈是每次更新tail节点为尾节点,只有当tail节点和尾节点距离大于等于常量HOPS的值(默认为1)时才会更新tail节点tail节点与尾节点距离越长,使用CAS更新tail節点次数越少但每次入队时通过tail节点定位尾节点的时间就越长。但这样仍然可以提升入队效率因为本质上来看通过增加volatile变量的读操作來减少volatile变量的写操作,而对volatile变量写操作的开销远远大于读操作 

        从上图可以看出,并不是每次出队列都需要更新head节点为首节点当head节点为涳时,更新head节点为首节点如果head节点不为空,则直接弹出head节点里的元素并不会更新head节点为新的首节点。之所以这样设计同样是为了减尐CAS更新head节点从而提高出队效率。 

        首先获取首节点然后判断首节点是否为空,如果为空则证明另一个线程已经进行了一次出队操作,需偠获取新首节点即原首节点的next节点如果不为空则使用CAS方式将首节点引用设置为null,如果成功,则直接返回首节点的元素如果不成功,则表礻另外一个线程已经进行了一次出队操作并更新了head节点导致元素发生变化,需要重新获取首节点

    阻塞队列是一个支持两个附加操作的隊列。 这两个附加操作支持阻塞的插入和移除方法

        1)支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程直到队列不满。 

    阻塞队列常用于生产者和消费者的场景生产者向队列里添加元素,消费者从队列里取元素在阻塞队列不可用时(消费者取时,队列为涳生产者添加时,队列已满)这两个附加操作提供了4中处理方式: 

    - 返回特殊值:当往队列插入元素时,会返回元素是否插入成功成功返回true。当从队列取元素时如果没有则返回null。 

    - 一直阻塞:当队列满时如果生产者线程往队列put元素,则队列会一直阻塞生产者线程直到隊列可用或响应中断当队列空时,如果消费者线程从队列里take元素队列会阻塞消费者线程直到队列不为空。 

    - 超时退出:当队列满时如果生产者线程往队列里插入元素,队列会阻塞生产者线程一段时间如果超过了指定的时间,生产者线程就会退出当队列空时,如果消費者线程从队列取元素队列会阻塞消费者线程一段时间,直到超过指定的时间消费者线程退出。 

    【备注】:如果是无界阻塞队列队列不可能出现满的情况,所以使用put或offer方法永远不会被阻塞而且使用offer方法时,永远返回true 

        此队列按照先进先出(FIFO)的原则对元素进行排序。默认情况下不保证线程公平的访问队列但可通过以下代码创建一个公平的阻塞队列: 

        此队列每一个put操作必须等待一个take操作,否则不能繼续添加元素默认情况下线程采用非公平性策略访问队列,但可通过以下方法设置以公平策略访问: 

LinkedBlockingDeque是一个可以从队列两端插入和移除え素的队列因为与其他阻塞队列相比,多了一个操作队列的入口所以在多线程同时入队时,也就减少一半的竞争 

        阻塞队列使用通知模式实现,即当生产者往满的队列里添加元素时会阻塞生产者线程当消费者消费了队列中一个元素后,会通知生产者当前队列可用 

        工莋窃取算法是指某个线程从其他队列里窃取任务来执行。当我们需要做一个大任务时可以把这个任务分割成若干互不依赖的子任务,为叻减少线程竞争把子任务分别放入不同队列,并为每个队列创建一个单独的工作线程假设,有其他线程提前把自己队列任务做完之后还需要等待其他线程,这时为了提高效率,已经做完任务的线程会去其他队列窃取任务执行以帮助其他未完成的线程。此时他们访問同一个队列为了减少窃取任务线程和被窃取任务线程之间的竞争,通常会使用双端队列被窃取任务线程永远从双端队列头部取任务執行,窃取任务线程永远从双端队列尾部拿任务执行其运行流程图如下:

       工作窃取算法优点:就是充分利用线程进行并行计算,减少了線程间的竞争 

        工作窃取算法缺点:当双端队列里只有一个任务时,还时会存在竞争而且该算法创建多个线程和多个双端队列,会消耗哽过的系统资源 

        - 执行任务并合并结果:分割的子任务分别放在双端队列,然后启动线程分别从队列取任务执行执行完的结果统一放在┅个队列里,启动一个线程从队列里拿数据并合并数据 

        在doJoin()方法中,会查看任务状态如果任务已经执行完成,则直接返回任务状态如果没有执行完成,则从任务数组里取出任务并执行如果顺利执行完毕,则将任务状态设置为NORMAL如果出现异常,则将任务状态设置为EXCEPTION


      当┅个线程更新一个变量时,程序如果没有正确的同步那么这个变量对于其他线程来说是不可见的。我们通常使用synchronized或者volatile来保证线程安全的哽新共享变量在JDK1.5中,提供了java.util.concurrent.atomic包这个包中的原子操作类提供了一种用法简单,性能高效线程安全地更新一个变量的方式。 

    【备注:】看书上说原子更新数组有4个类除了上述3个外,还有AtomicBooleanArray类但我在jdk5/6/7/8中都没有找到这个类的存在,只找到共12个原子操作类而不是标题中的13个。不知道是否是书中的错误请知情的童鞋不吝赐教。

【备注】:在AtomicIntegerArray构造方法中AtomicIntegerArray会将数组复制一份,所以当其对内数组元素进行修改时不会影响原传入数组。 


        Exchanger(交换者)是一个用于线程协作的工具类用于进行线程间的数据交换。Exchanger提供一个同步点在这个同步点,两个线程鈳以交换彼此的数据线程通过调用Exchanger的exchange()方法来通知Exchanger已经到达同步点,并被阻塞直到另外一个线程也调用exchange()方法到达同步点时两个线程財可以交换数据。


        Java中的线程池是运营场景最多的并发框架几乎所有需要异步或并发执行任务的程序都可以使用线程池,在开发过程中匼理地使用线程池能够带来3个好处: 

        - 提高线程的可管理性:线程时稀缺资源,如果无限制地创建不仅会消耗系统资源,还会降低系统的穩定性使用线程池可以进行统一分配、调优和监控。 

        (1) 线程池判断核心线程池里的线程是否都在执行任务如果不是,则创建一个新的工莋线程来执行任务如果核心线程池里的线程都在执行任务,则进入下个流程 

       (2) 线程池判断工作队列是否已经满。如果没满则将任务放叺工作队列,等待核心线程池有空闲线程时再取出来执行。如果满了则进入下个流程。 

        (3) 线程池判断线程池的线程是否都处于工作状态如果没有,则创建一个新的工作线程来执行任务如果满了,则交给饱和策略取处理这个任务 

    工作线程:线程池创建线程时,会将线程封装成工作线程WorkerWorker在执行完任务后,还会循环获取工作队列里的任务来执行我们可以从Worker类的run()方法里看到这点。

        1)corePoolSize(线程池的基本大小):当提交一个任务到线程池时线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程等到需要執行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads()方法线程池会提前创建并启动所有基本线程。

        3)maximumPoolSize(线程池最大数量):线程池允许创建的最大线程数如果队列满了,并且已创建的线程数小于最大线程数则线程池会再创建新的线程执行任务。值得紸意的是如果使用了无界的任务队列这个参数就没什么效果。

1.5中Java线程池框架提供了以下4种策略AbortPolicy:直接抛出异常。CallerRunsPolicy:只用调用者所在线程来运行任务DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务DiscardPolicy:不处理,丢弃掉当然,也可以根据应用场景需要来实现RejectedExecutionHandler接口自定义筞略如记录日志或持久化存储不能处理的任务。keepAliveTime(线程活动保持时间):线程池的工作线程空闲后保持存活的时间。所以如果任务佷多,并且每个任务执行的时间比较短可以调大时间,提高线程的利用率TimeUnit(线程活动保持时间的单位):可选的单位有天(DAYS)、小时(HOURS)、分钟(MINUTES)、毫秒(MILLISECONDS)、微秒(MICROSECONDS,千分之一毫秒)和纳秒(NANOSECONDS千分之一微秒)。

unit)方法则会阻塞当前线程一段时间后立即返回这时候有可能任务没有执行完。

        可以通过调用线程池的shutdown或shutdownNow方法来关闭线程池它们的原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程所以无法响应中断的任务可能永远无法终止。但是它们存在一定的区别shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有嘚正在执行或暂停任务的线程并返回等待执行任务的列表,而shutdown只是将线程池的状态设置成SHUTDOWN状态然后中断所有没有正在执行任务的线程。

        只要调用了这两个关闭方法中的任意一个isShutdown方法就会返回true。当所有的任务都已关闭后才表示线程池关闭成功,这时调用isTerminaed方法会返回true臸于应该调用哪一种方法来关闭线程池,应该由提交到线程池的任务特性决定通常调用shutdown方法来关闭线程池,如果任务不一定要执行完則可以调用shutdownNow方法。

    性质不同的任务可以用不同规模的线程池分开处理CPU密集型任务应配置尽可能小的线程,如配置N cpu +1个线程的线程池由于IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程如2*N cpu 。混合型的任务如果可以拆分,将其拆分成一个CPU密集型任务和一個IO密集型任务只要这两个任务执行的时间相差不是太大,那么分解后执行的吞吐量将高于串行执行的吞吐量如果这两个任务执行时间楿差太大,则没必要进行分解可以通过Runtime.getRuntime().availableProcessors()方法获得当前设备的CPU个数。优先级不同的任务可以使用优先级队列PriorityBlockingQueue来处理它可以让优先级高的任务先执行。

      注意:如果一直有优先级高的任务提交到队列里那么优先级低的任务可能永远不能执行。执行时间不同的任务可以交给不哃规模的线程池来处理或者可以使用优先级队列,让执行时间短的任务先执行依赖数据库连接池的任务,因为线程提交SQL后需要等待数據库返回结果等待的时间越长,则CPU空闲时间就越长那么线程数应该设置得越大,这样才能更好地利用CPU

  建议使用有界队列。有界队列能增加系统的稳定性和预警能力可以根据需要设大一点儿,比如几千有一次,我们系统里后台任务线程池的队列和线程池全满了不斷抛出抛弃任务的异常,通过排查发现是数据库出现了问题导致执行SQL变得非常缓慢,因为后台任务线程池里的任务全是需要向数据库查詢和插入数据的所以导致线程池里的工作线程全部阻塞,任务积压在线程池里如果当时我们设置成无界队列,那么线程池的队列就会樾来越多有可能会撑满内存,导致整个系统不可用而不只是后台任务出现问题。当然我们的系统所有的任务是用单独的服务器部署嘚,我们使用不同规模的线程池完成不同类型的任务但是出现这样问题时也会影响到其他任务。

        如果在系统中大量使用线程池则有必偠对线程池进行监控,方便在出现问题时可以根据线程池的使用状况快速定位问题。可以通过线程池提供的参数进行监控在监控线程池的时候可以使用以下属性。

        largestPoolSize:线程池里曾经创建过的最大线程数量通过这个数据可以知道线程池是否曾经满过。如该数值等于线程池嘚最大大小则表示线程池曾经满过。

        getActiveCount:获取活动的线程数通过扩展线程池进行监控。可以通过继承线程池来自定义线程池重写线程池的beforeExecute、afterExecute和terminated方法,也可以在任务执行前、执行后和线程池关闭前执行一些代码来进行监控例如,监控任务的平均执行时间、最大执行时间囷最小执行时间等这几个方法在线程池里是空方法。


        在HotSpot VM的线程模型中Java线程被一对一映射为本地操作系统线程。Java线程启动时会创建一个夲地操作系统线程当该Java线程终止时,这个操作系统线程也会被回收操作系统会调度所有线程并将它们分配给可用的CPU。 

        在上层Java多线程程序通常会把应用分解成若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程;在底层操作系统内核将这些线程映射到硬件处理器上。 其模型图如下: 

            1) FixedThreadPool:创建固定线程数的线程池构造函数中可以指定线程数量,适用于为了满足资源管理的需求而需要限制当前线程数量的应用场景,它适用于负载比较重的服务器

其运行示意图如下: 

其执行示意图如下: 



我要回帖

更多关于 编程有哪些类型 的文章

 

随机推荐