精通lambda表達式 Java多核編程[Mastering Lambdas: Java Programming in a Multicore]pdf

满堂彩
满堂彩
满堂彩
10930
文章
1669
評論
2020年10月8日21:10:58 評論 12

精通lambda表達式 Java多核編程[Mastering Lambdas: Java Programming in a Multicore] 作者:(美) 那夫特林(Naftalin,M. )

精通lambda表達式 Java多核編程[Mastering Lambdas: Java Programming in a Multicore] 出版社:清華大學出版社

精通lambda表達式 Java多核編程[Mastering Lambdas: Java Programming in a Multicore] 內容簡介

lambda表達式指南 《精通lambda表達式:Java多核編程》介紹Java SE 8中與lambda相關的特性是如何幫助Java迎接下一代並行硬件架構的挑戰的。本書講解了如何編寫lambda、如何在流與集合處理中使用lambda,並且提供了完整的代碼示例。你將學習如何通過lambda表達式充分利用當今多核硬件所帶來的性能改進。

主要內容:

● 為何需要lambda,它將如何改變Java編程

● lambda表達式語法

● 流與管道的基本操作

● 使用收集器與匯聚來終止管道

● 創建流

● 分割迭代器、fork/join框架與異常

● 使用微基準測試檢查流的性能

● 使用默認方法演化API

精通lambda表達式 Java多核編程[Mastering Lambdas: Java Programming in a Multicore] 目錄

前言

第1章 走進新生代的Java

1.1 從外部迭代到內部迭代

1.2 從集合到流

1.3 從串行到並行

1.4 組合行為

1.5 小結

第2章 Javalambda表達式的基礎知識

2.1 lambda表達式的定義

2.2 lambda與匿名內部類

2.3 變量捕獲

2.4 函數式接口

2.5 使用lambda表達式

2.6 方法與構造器引用

2.7 類型檢查

2.8 重載解析

2.9 小結

第3章 流與管道介紹

3.1 流基礎

3.2 剖析管道

3.3 小結

第4章 終止流:收集與匯聚

4.1 使用收集器

4.2 剖析收集器

4.3 編寫收集器

4.4 匯聚

4.5 小結

第5章 起始流:源與分割迭代器

5.1 創建流

5.2 分割迭代器與Fork/Join

5.3 異常

5.4 示例說明:遞歸grep

5.5 小結

第6章 流的性能

6.1 微基準度量

6.2 選擇執行模式

6.3 流的特性

6.4 排序

6.5 有狀態操作與無狀態操作

6.6 裝箱與拆箱

6.7 分割迭代器性能

6.8 收集器性能

6.9 小結

第7章 使用默認方法演化APl

7.1 使用默認方法

7.2 抽象類的角色是什麽

7.3 默認方法的語法

7.4 默認方法與繼承

7.5 接口中的靜態方法

7.6 小結

本書總結

精通lambda表達式 Java多核編程[Mastering Lambdas: Java Programming in a Multicore] 精彩文摘

Java 8可謂Java語言曆史上變化*大的一個版本,這體現在語言、庫與虛擬機協調一致的變化上。其承諾要改變我們思考Java程序執行的方式,並且讓語言適合於不久之後將要到來的在大規模並行硬件上的使用。不過相對於如此重要的創新,語言的實際變化卻顯得有些微不足道。這些表麵上的微小變化到底是如何產生這種巨大的差別的呢?我們為何要改變Java中已經使用了這麽多年(實際時間比這還要長)的編程模型呢?本章將會談及這種模型的限製,同時還會介紹Java 8中lambda相關的特性是如何促使Java不斷演進以滿足新一代硬件架構的挑戰的。

1.1 從外部迭代到內部迭代

首先來看一段簡單的代碼,這段代碼會迭代一個包含著可變對象的集合,並對集合中的每個對象調用一個方法。如下代碼片段會構造一個java.awt.Point(Point是個便捷、簡單的庫類,包含了一對(x,y)坐標)對象的集合。接下來,代碼會對集合進行迭代,並對每個Point沿著x與y軸各平移1個單位的距離。

Point(2, 3));

for (Point p:pointList) {

p.translate(1, 1);

}

在Java 5引入for-each循環前,我們可以像下麵這樣編寫循環:

for (Iterator pointItr = pointList.iterator();

pointItr.hasNext(); ) {

((Point) pointItr.next()).translate(1, 1);

}

下麵這種寫法會更清晰一些(不過並不推薦這種寫法,因為它擴大了pointItr的作用域):

Iterator pointItr = pointList.iterator();

while (pointItr.hasNext()) {

((Point) pointItr.next()).translate(1, 1);

}

上述代碼中,pointList會創建一個Iterator對象,接下來我們通過該對象依次訪問pointList中的元素。這個版本的代碼還是非常有意義的,因為時至今日這正是Java編譯器生成的用於實現for-each循環的代碼。對於我們來說,其關鍵在於訪問pointList中元素的順序是由Iterator控製的——我們無法改變這一點。比如,針對ArrayList的Iterator會按照先後順序返回列表中的元素。

這麽做為什麽會有問題呢?畢竟,Java Collections Framework是在1998年設計的,看起來按照這種方式來指定列表元素的訪問順序是合情合理的。從那時起發生了什麽變化呢?

部分原因在於硬件在不斷演進。長久以來,工作站與服務器都配有多個處理器,不過在設計Java Collections Framework框架的1998年與個人電腦中首個雙核處理器出現的2005年之間,芯片設計領域的革命爆發了。40年來處理器速度以指數級別增長的趨勢停止了,這是由於如下不可避免的事實造成的:信號泄漏、散熱不充分,以及雖然到達了光速,但數據無法足夠快地跨越芯片以實現更快的處理器速度的增長。

不過雖然存在時鍾頻率的限製,芯片組件的密度還在持續增加。因此,既然無法提供6 GHz的核,芯片廠商轉而開始提供雙核處理器,每個核運行於3 GHz。這種趨勢還在持續,目前還沒有終止的跡象;在Java 8發布之時(2014年3月),四核處理器已經成為主流,八核處理器也已經出現在硬件市場上,而專業服務器早就在每個處理器中放置了幾十個核。趨勢很明顯,不適應這種狀況的任何編程模型都會在與適應這種狀況的模型的競爭中敗下陣來。適應意味著向開發者提供一種可訪問的方式,使之能夠將多個任務分發到多個核上並行執行,從而利用多核的處理能力。另一方麵,不適應意味著默認情況下Java程序會被綁定到單個核上,相對於那些能夠幫助用戶並行運行代碼的語言來說,這會極大地降低程序的運行速度。

本節一開始的代碼已經表明了改變的必要性,代碼一次隻能根據迭代器指定的順序訪問一個列表元素。集合處理並非程序員執行的唯一一個處理器密集的任務,不過它卻是*重要的任務之一。Java循環構建中所用的迭代模型會強製順序處理集合元素,如果對運行時*迫切的需求剛好相反(至少要考慮性能因素):將處理分發到多個核上,那麽這就會產生嚴重的問題。第6章將會談到,並不是每個問題都會從並行化中獲益,不過*好的情況則是程序的加速幾乎與核心數量線性相關。

1.1.1 內部迭代

在考慮將迭代的順序模型應用到真實世界的場景中時就會發現其侵入性變得非常明顯。如果有人通過如下指令讓你郵寄一些信件——“重複如下動作:如果還有信件,那麽按照收件人姓氏的字母表順序取出下一個,然後將其放到郵箱中”,那麽你可能會覺得他這麽說太囉嗦了。你知道在這個任務中順序並不重要,無論是順序執行還是並行執行都可以,隻不過不要遺漏信件即可。這時,你會覺得在存在更好策略的情況下,外部迭代導致集合隻能連續並且按照固定順序處理元素的做法實在是太低效了。

實際上,對於這個現實任務來說,你隻需要知道每封信件都要郵寄出去即可;到底該怎麽做取決於你自己。同樣,我們應該告訴集合應該對它們所包含的每一個元素采取什麽動作,而不是像外部迭代那樣指定怎麽做。如果能夠做到這一點,那麽代碼會變成什麽樣子呢?集合隻需要公開一個方法來接受“做什麽”,也就是說對每一個元素要執行什麽任務;這個方法的一個顯而易見的名字就是forEach。借助於它,我們可以像下麵這樣替換掉本節一開始的迭代代碼:

pointList.forEach(/*translate the point by (1,1)*/);

在Java 8之前,這個建議看起來會很奇怪,因為java.util.List(pointList的類型)並沒有forEach方法,作為一個接口,我們也無法向其添加方法。不過,第7章將會看到Java 8通過引入非抽象接口方法解決了這一問題。

新方法Collection.forEach(實際上是由Collection從其父接口Iterable繼承的)隻不過是內部迭代的一個示例,之所以這麽說是因為,雖然已經看不到顯式的迭代代碼,但迭代依舊在內部發生。迭代現在由forEach方法管理,它會對集合中的每個元素應用其行為參數。

從外部迭代到內部迭代的變化看起來很小,隻不過是迭代工作跨越了客戶端-庫的邊界。不過,其結果卻並不是那麽簡單。我們所需要的並行工作現在可以定義在集合類中,不必重複寫在每一個要迭代集合的客戶端方法中。此外,實現上可以自由使用其他技術,比如說延遲加載、亂序執行或是其他方法,從而更快地獲得結果。

如果編程模型允許集合庫的作者針對每個集合自由選擇*佳的批處理實現方式,那麽內部迭代就很有必要了。不過要想替換forEach調用中的注釋,那麽該如何告訴集合方法應對每個元素執行什麽任務呢?

满堂彩:精通lambda表達式 Java多核編程[Mastering Lambdas: Java Programming in a Multicore]pdf

繼續閱讀
資源地址:用心發表評論,談談你的看法,說不定有意向不到的收獲。
  • 我的微信
  • 掃一掃加好友
  • weinxin
  • 微信公眾號
  • 掃一掃關注
  • weinxin
程序員之禪pdf 程序設計

程序員之禪pdf

程序員之禪 作者: Christian Grobmeier 程序員之禪 出版社:人民郵電出版社 程序員之禪 內容簡介 禪是一種生活態度和生活方式。程序員是一份特別辛苦的職業,也是一個承受各種壓力的群體...
C++覆轍錄pdf 程序設計

C++覆轍錄pdf

C++覆轍錄 作者:(美)STEPHEN C. DEWHURST C++覆轍錄 出版社:人民郵電出版社 C++覆轍錄 內容簡介 《C++覆轍錄》是C++大師Stephen C. Dewhurst根據多...
JRockit權威指南 深入理解JVMpdf 程序設計

JRockit權威指南 深入理解JVMpdf

作為曾經的三大主流Java虛擬機之一,JRockit展示了強大的伸縮性和高勁的性能,現在雖已被內置於Oracle融合中間件中,但JVM原理以及JMC工具等內容是相通的。 本書由JR...
ioses 11 開發指南pdf 程序設計

ioses 11 開發指南pdf

ioses 11 開發指南 作者:管蕾 ioses 11 開發指南 出版社:人民郵電出版社 ioses 11 開發指南 內容簡介 本書循序漸進地講解了ioses 11應用開發的知識。書中從搭建開發環境講起,依次講解了...
匿名

發表評論

匿名網友 填寫信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: