讀古今文學網 > Java程序員修煉之道 > 14.3 未來的並發趨勢 >

14.3 未來的並發趨勢

20世紀的語言不一定能充分發揮21世紀的硬件的作用。我們之前討論的內容已經多次暗示了這一點。在第6章討論晶體管數量增長的摩爾定律時(6.3.1節),由於一個非常重要的原因,我們當時僅簡要討論了一下。那就是摩爾定律、性能和並發之間的相互作用,這也是我們的第一個主題。

14.3.1 多核的世界

儘管晶體管數量的爆炸性增長跟預測一樣,但內存的訪問速度卻沒能跟上。在20世紀90年代和21世紀頭幾年,芯片設計者用大量晶體管解決相對較慢的主存問題。

就像第6章討論的,這可以確保有穩定的數據流供核心處理。但這根本是一場輸掉的戰鬥:在晶體管上提升的速度變得越來越邊際化。這是因為過去用的技術(比如指令級並行和投機式執行)現在已經把容易提升的速度搾光了,投機性變得越來越強。

最近這些年,業界已經把注意力轉到了用晶體管在每個芯片上提供更多處理器內核。現在幾乎所有筆記本或台式機都至少是雙核的,4核和8核也很常見。在更高端的服務器上,可以找到6核或8核的芯片,整機能達到32(或更多)個核心。多核世界就在這裡,要充分發揮它的作用,需要以串行處理更少的風格編程。那需要得到語言和運行時環境的支持。

14.3.2 運行時管理的並發

我們已經看到了未來並發編程的開始。在Scala和Clojure中,我們討論了與Java的線程和鎖模型有很大差異的並發觀點:Scala的actor模型和Clojure的軟件事務型內存方式。

Scala的actor模型允許在運行的代碼塊之間發送消息,而這些代碼可能運行在完全不同的核心上(甚至有允許actor遠程運行的擴展)。這就是說代碼完全是按以actor為中心的方式編寫的,因此在多核機器上擴展非常簡單。

跟Scala actor一樣,Clojure中的代理填補了相同的生態位1,但Clojure中還有只能在一個內存事務中修改的共享數據(refs)——軟件事務型內存機制。

1 生態位(Ecological niche),又稱小生境、生態區位、生態棲位或是生態龕位,是一個物種所處的環境以及其本身生活習性的總稱。每個物種都有自己獨特的生態位,區別於其他物種。——譯者注

在這兩種並發中,都能見到一種新概念的萌芽:由運行時(而不是開發人員)管理並發。儘管JVM提供了線程調度的底層服務,但它沒有提供管理並發程序的高層結構。

這個缺陷在Java語言中能看出來,導致Java程序員基本上在用JVM的底層模型。

別對Java並發太過苛求

Java在1996年發佈,它是從一開始就考慮並發的主流語言之一。經過業界15年的廣泛實操,我們才對可變數據、默認共享狀態和用協作鎖強制排他執行這種模型的問題有所察覺。但發佈Java 1.0的工程師沒有這種福利。從很多方面來說,Java在並發上的首次嘗試都是我們取得今天這種成就的基礎。

現在有大把的代碼撒在外面,再為Java做一種全新的機制來強制推行,還要跟現有代碼無縫交互,這非常困難。所以大部分注意力都放在了為非Java的JVM語言找尋新的並發出路上。這些語言有兩個重要特性:

  • 以JMM為底層模型;
  • 跟Java相比有「全新設計」的語言運行時,可以提供不同的抽像層(並且強制性更強)。

在VM層面出現更多的並發支持也不是不可能(下一節會討論到),但目前來看主流還是在以JMM為基礎的新語言上做創新,而不是修改底層的基礎線程模型。

在JDK 8及以後的版本中,肯定能見到JVM的某些區域會發生變化。其中的一些變化順延了Java 7的invokedynamic,這也是我們要討論的下一主題。