<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    John Jiang

    a cup of Java, cheers!
    https://github.com/johnshajiang/blog

       :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理 ::
      131 隨筆 :: 1 文章 :: 530 評論 :: 0 Trackbacks
    Java Concurrent Animated
        在最新一期的Java Magazine中有一篇訪談,介紹了一個(gè)學(xué)習(xí)Java并發(fā)編程的動畫應(yīng)用Java Concurrent Animated。該應(yīng)用以十分直觀的方式展示了Java并發(fā)工具包中的每一個(gè)重要組件,降低了學(xué)習(xí)Java并發(fā)編程的難度。(2013.12.07最后更新)

    Java Magazine:有多少人已經(jīng)試用過了你的Java Concurrent Animated應(yīng)用?
    Grazi:該應(yīng)用是在2009年7月被引入的,從那時(shí)算起,已經(jīng)有了大約20000的下載量。但考慮到已有約一千萬的Java開發(fā)者,這個(gè)下載量才只是開始。按國家區(qū)分,下載最多的分別是美國(23%),印度(14)和中國(7%)。
        你可以下載一個(gè)可以執(zhí)行的JAR文件,然后僅需雙擊它就可以運(yùn)行了。該應(yīng)用是由菜單驅(qū)動的,或者也可以使用向上或向下鍵在不同的圖像和動畫之間進(jìn)行導(dǎo)航。它能運(yùn)行在諸如Windows,Mac,Linux等等所有的平臺上。它要求安裝Java SE 6或更高的版本。

    Java Magazine:對這個(gè)應(yīng)用最典型的反饋是什么?
    Grazi:大家告訴我這個(gè)工具很好用。許多人確實(shí)對此感到興奮,尤其是那些正試圖向團(tuán)隊(duì)教授合適并發(fā)技術(shù)的老師與領(lǐng)導(dǎo)們。Java是最早在核心類庫中引入并發(fā)的語言之一。在當(dāng)時(shí),這是一個(gè)很強(qiáng)大的特性,但我們很快就發(fā)現(xiàn)一個(gè)非常優(yōu)秀的程序員與會寫出很糟糕的并發(fā)代碼。進(jìn)行恰當(dāng)?shù)牟l(fā)編程是一件困難甚至是不可能的事情,但是如何人們能花些時(shí)間去理解一些現(xiàn)有的框架,那么在進(jìn)行并發(fā)編碼時(shí)所產(chǎn)生潛在錯誤就會變得極少。
        例如,去看看Java內(nèi)存模型。開發(fā)者經(jīng)常忽視Java內(nèi)存模型,而像個(gè)幸福的傻瓜一樣在編碼,那么他們的程序會不太正常,因?yàn)镴ava虛擬機(jī)(JVM)和服務(wù)器可能無法利用到由Java內(nèi)存模型所提供的優(yōu)化。由于內(nèi)核在速度與數(shù)量上都有了增長,廠商們期望能夠高效地利用到這些內(nèi)核,然而由于錯誤的并發(fā)管理,本來如期運(yùn)行的程序卻開始遇到了一些零星的錯誤。

    Java Magazine:你是說,這個(gè)應(yīng)用會以我們所虛構(gòu)的方式去使開發(fā)者們能夠更快且直觀地掌握J(rèn)ava并發(fā)的原理與實(shí)踐?
    Grazi:那是達(dá)到這一目的一個(gè)有趣的途徑。你知道的,Java Concurrent Animated并不是一個(gè)Flash動畫。它是一組可交互的Java程序,也即,每個(gè)動畫都是真地在使用它所要演示的并發(fā)組件。在屏幕的右邊是一個(gè)展示代碼片斷的面板,由于動畫的運(yùn)行,它會動態(tài)地高亮顯示及恢復(fù)正在執(zhí)行的代碼。
        讓你給你一個(gè)例子,這個(gè)例子發(fā)生在ReadWriteLock這個(gè)動畫中。ReadWriteLock用于確保數(shù)據(jù)的一致性。它允許不受數(shù)量限制的線程去獲取讀鎖,并能并發(fā)地對這個(gè)鎖進(jìn)行操作。但是,寫線程在獲取這個(gè)鎖之前只能等待所有的讀線程執(zhí)行結(jié)束。一旦一個(gè)寫線程獲得了這個(gè)鎖,那么其它的讀線程或?qū)懢€程將無法獲取它。
        假設(shè)一個(gè)寫線程正在等待正在執(zhí)行中的讀線程去釋放這個(gè)讀鎖,但突然一個(gè)新的讀線程跑過來了。那么誰應(yīng)該獲得這個(gè)鎖會比較好呢?這個(gè)新的讀線程應(yīng)該跑到寫線程前面去嗎?畢竟,如果其它的讀線程已經(jīng)獲得了這個(gè)鎖,那么新來的讀線程為什么要去等一個(gè)尚在等待中的寫線程呢?而這實(shí)際上這正是Java 5所干的事兒。但某次我在Java 6上運(yùn)行這個(gè)動畫時(shí),我注意到行為發(fā)生了改變。即,隨后而來的讀線程在獲取到這個(gè)鎖之前可能要等待所有的寫線程先釋放鎖。
        我認(rèn)為這個(gè)新的行為是一個(gè)BUG,且向并發(fā)專家Heinz Kabutz博士提及了此事。博士解釋道,這不是一個(gè)錯誤,而一個(gè)特性。如果允許新到的讀線程跳到正處于等待中的寫線程的前面去,這就存在產(chǎn)生線程饑餓條件的高風(fēng)險(xiǎn)。因?yàn)椋嬖谝环N很大的可能性,可能沒有任何寫線程能獲得這個(gè)鎖,它們將永遠(yuǎn)等待著。這就是一個(gè)如何使用動畫去警示依賴于JVM運(yùn)行時(shí)版本的線程行為的例子。

    Java Magazine:以動畫教程的形式來展示特殊值,在Java并發(fā)編程中有何與眾不同嗎?
    Grazi:Miller定律教會我們,我們的大腦在某一時(shí)刻能處理的思維的數(shù)量是有限的。人類大腦傾向于進(jìn)行順序的思維處理,那么即便我們能夠克服身體上的束縛,并能夠去正確地進(jìn)行理解,在以后也很難返回至前去重新構(gòu)造前面的思維處理。可以肯定地是,如果另一個(gè)開發(fā)者在以后能深入對其進(jìn)行研究,那么仍然非常難以從原有的思維成果中再次捕捉到認(rèn)知軌跡。這樣的話,脆弱的代碼就會很突然地不能正常工作了。
        通過使用框架,我們不僅將并發(fā)編程委托給了創(chuàng)建和維護(hù)該框架的聰明開發(fā)者們,而且還為溝通設(shè)計(jì)時(shí)引入了一個(gè)詞典。所以,我可以說,“下面的代碼會當(dāng)作CyclicBarrier去執(zhí)行”,而人們會明白那是什么意思。通過為java.util.concurrent中的所有組件都引入一個(gè)可交互化的動畫應(yīng)用,開發(fā)者們點(diǎn)著鼠標(biāo)就能很方便地將他們所探究的功能進(jìn)行可視化,使理解這些算法變得真心簡單了。

    Java Magazine:你當(dāng)時(shí)正在研究某些直覺,這些直覺可以幫助更方便地學(xué)習(xí)并發(fā)編程。從開發(fā)者的反饋來看,這些直覺看起來是有效的。
    Grazi:是的。例如,我前面解釋的ReadWriteLock基本功能。讀者們可能理解了,也可能沒有。現(xiàn)在讓我們看看這個(gè)與其有關(guān)的動畫,如圖表1所示。

        綠色線程是讀線程,最上面的白色線程(帶著菱形箭頭)是一個(gè)寫線程,它下面的白色線程是一個(gè)新的讀線程,該線程在獲取鎖之前必須要等待所有的讀線程與寫線程執(zhí)行完畢。如果你點(diǎn)擊按鈕并觀看這些動畫,會比通過瀏覽繁冗的解釋性文字去進(jìn)行理解要簡單得多了。

    Java Magazine:Heinz Kabutz評論道,Java被構(gòu)建成能夠一次性做許多事情,而這正與并發(fā)完全相關(guān)。你的學(xué)習(xí)系統(tǒng)是如何提高程序員的技能,以便他們能降低并發(fā)錯誤的風(fēng)險(xiǎn)。
    Grazi:經(jīng)常地,當(dāng)我要努力克服一個(gè)并發(fā)問題時(shí),我知道解決方案就存在于某個(gè)設(shè)計(jì)模式中,但是哪一個(gè)呢?在開發(fā)者探尋一個(gè)正確解決方案時(shí),Java Concurrent Animated為他們提供了一個(gè)所有方案的目錄;在激發(fā)出正確方案的過程中,它扮演著向?qū)У慕巧?/span>

    Java Magazine:當(dāng)你管理的團(tuán)隊(duì)正在使用Java并發(fā),并且你和你的團(tuán)隊(duì)都想更好地去理解Java并發(fā),Java Concurrent Animated有著它的出發(fā)點(diǎn)。是什么導(dǎo)致你使用動畫呢,能描述下這個(gè)過程嗎?
    Grazi:我的培訓(xùn)是針對投資部門的服務(wù)器端Java應(yīng)用,在那里,并發(fā)是一個(gè)通常都會受到關(guān)注的問題。交易員們要求延遲要低,這樣可以確保他們在這個(gè)需要于一毫秒窗口時(shí)間內(nèi)捕捉交易機(jī)會的比賽中不會成為失敗者。批量處理也要求快速完成,等等。所以我開始看到那些可怕的只寫(write-only)組件,這些組件使人們在并發(fā)編程掙扎著。我自己也身處其中。
        某天下午,我正坐在機(jī)場內(nèi),將要前往芝加哥為我的團(tuán)隊(duì)做一個(gè)關(guān)于并發(fā)的講演。我正對講演的PPT進(jìn)行最后的處理,那組幻燈片著重演示了每一個(gè)重要的組件。為了引導(dǎo)我瀏覽java.util.concurrent中每個(gè)并發(fā)組件的狀態(tài),我寫了一些狀態(tài)機(jī),它們展示了一些供我參考用的簡單文本消息。在之前的生涯中,我曾在一家互聯(lián)網(wǎng)創(chuàng)業(yè)公司中開發(fā)交互式的游戲,所以我懂得許多與動畫相關(guān)的知識。這使我想到可以將PPT替換成一組交互式的動畫應(yīng)用,那會更為直觀。
        在等飛機(jī)的過程中,我寫了一個(gè)初步的動畫引擎,然后在我的狀態(tài)機(jī)中調(diào)用了這個(gè)引擎。到了第二天早晨,我已經(jīng)有一個(gè)可用的原型程序。多年來,我一直致力于這個(gè)框架,并且吸引了其他專家的建議。我傳遞過一份早期版本給Brian Goetz,令人驚訝的是,他為每個(gè)動畫程序都給出了建議。我將他的所有建議到吸收到了該框架中。在我的第一次JavaOne講演中,Kirk Pepperdine加入了進(jìn)來。他建議為動畫應(yīng)用在真正的PPT中加入描述,以便講演者能記住正在討論的內(nèi)容。隨后我加上那些描述,這確實(shí)非常有用--不只是對講演者有用,對于終端用戶也很有用。Heinz Kabutz也加入了那場講演,并建議修改某些動畫,以使它們更為直觀。
        在另一場講演中,一個(gè)很有激情的軟件咨詢師Oliver Zeigermann指出,很顯然缺少了針對ConcurrentHashMap的動畫。我問他是否有興趣貢獻(xiàn)這個(gè)動畫,隨后他添加了那個(gè)很有價(jià)值的動畫程序。

    Java Magazine:你能帶著我們過一遍Java并發(fā)工具包中的類嗎?并能否解釋一下這些動畫程序是如何使開發(fā)者們更易于深入理解這些類?
    Grazi:好的,但在沒有動畫程序的情況下確實(shí)很難辦到。讓我們看看CyclicBarrier,它有兩個(gè)重要的狀態(tài),如圖2和圖3所示,它們展示了一個(gè)障礙和四個(gè)成員。在圖2中,我們可以看到有三個(gè)成員已經(jīng)到了,所以它們被阻止繼續(xù)前進(jìn)。圖3展示了,一旦第四個(gè)成員也到達(dá)了,每個(gè)成員又可以向前走了。



        這就形象地詮釋了障礙的概念,亦即,在所有成員到達(dá)障礙點(diǎn)之前,每個(gè)成員必須等待。隨著并發(fā)組件復(fù)雜度的增加--例如Fork/Join的動畫,以及那些演示原生的wait和notify機(jī)制的動畫--使用動畫程序的好處就更不肖說了。

    Java Magazine:談?wù)勗趧?chuàng)建這些動畫程序的過程中所遇到的一些挑戰(zhàn)。
    Grazi:有一些挑戰(zhàn)。開始時(shí),線程被表示成箭頭。對于多數(shù)并發(fā)組件,這種表示法是有效的。后來我們必須提供一個(gè)可視化方案,不僅要表示線程,還要表示BlockingQueue中的對象。所以,我不得不引入一個(gè)稱之為"精靈類型(sprite-type)"的概念,然后我們有了一個(gè)箭頭型的精靈類型和一個(gè)新的"對象"型的精靈類型。后來,ConcurrentHashMap和AtomicInteger又需要新的精靈類型,因?yàn)槲覀冊噲D要對他們的計(jì)算與交換行為進(jìn)行可視化。
        后面又來了Fork/Join,新的挑戰(zhàn)就是如何去表現(xiàn)那些完全不同于現(xiàn)有框架所表現(xiàn)的可視化部件。還有一個(gè)挑戰(zhàn),即Fork/Join動畫需要解決一個(gè)實(shí)際的問題,但這個(gè)動畫應(yīng)該解決一個(gè)什么樣的問題呢?
        開始時(shí),我讓這個(gè)動畫程序去求Fibonacci數(shù)列,但卻行不通。我在這個(gè)問題上糾結(jié)了兩天時(shí)間,直到我認(rèn)識到Fibonacci數(shù)列(Fn+1=Fn+Fn-1)無法高效地并行化,因?yàn)槊總€(gè)值都依賴于它前面的值。所以,無論你如何試圖對其實(shí)施并行化,它天生就是一個(gè)順序化的計(jì)算。所以我換成了另一個(gè)問題--查找數(shù)組中的最大元素,這樣就好了。在這個(gè)動畫中,你可以很精確地看到如何使用一個(gè)隨機(jī)的數(shù)列去解決這個(gè)問題(如圖4所示)。


    Java Magazine:你都在哪里講演過這些動畫程序?
    Grazi:在JavaOne中講演過幾次,在其它的許多會議,如奧斯陸中的JavaZone,蘇黎世的Jazoon,紐約的QCon,以及許多SIG(特別興趣組)和JUG(Java用戶組)中也都講演過。我喜歡講演,我也喜歡周游世界,而Java Concurrent Animated為我提供了一個(gè)極好的機(jī)會去做這兩件事情。它總能獲得極高的評價(jià)。
        Java Concurrent Animated的講演提供了一種意識,并且它們也向出席的開發(fā)者們展示了下載這一框架的價(jià)值,而且它還展示了,如果你擁有了框架和靈感啟迪,學(xué)習(xí)并發(fā)編程會是多么的容易。
    posted on 2013-12-07 17:45 John Jiang 閱讀(2395) 評論(1)  編輯  收藏 所屬分類: JavaSEJavaConcurrency翻譯

    評論

    # re: Java Concurrent Animated(譯) 2013-12-14 23:55 左岸
    說實(shí)話還真沒有了解的這么深過 學(xué)習(xí)了  回復(fù)  更多評論
      

    主站蜘蛛池模板: 凹凸精品视频分类国产品免费| 又大又硬又爽免费视频| 亚洲六月丁香六月婷婷蜜芽| 在线观看国产情趣免费视频| 久久免费99精品国产自在现线| 亚洲无圣光一区二区| 暖暖免费高清日本中文| APP在线免费观看视频| 亚洲av成人综合网| 久久久久国产亚洲AV麻豆| 中文毛片无遮挡高潮免费| 一级特黄aaa大片免费看| 亚洲精品一区二区三区四区乱码| 国产片免费福利片永久| 日韩电影免费在线观看中文字幕| 亚洲欧美自偷自拍另类视| 亚洲va久久久噜噜噜久久天堂| 四虎成人免费网站在线| 一区二区三区观看免费中文视频在线播放 | 国产青草亚洲香蕉精品久久| 久久青草亚洲AV无码麻豆| 国产一级高清免费观看| 黄色成人免费网站| 最近更新免费中文字幕大全| 亚洲精品无码久久久久久| 中文字幕亚洲综合久久2| 亚洲精品国产精品乱码不卡| 在线v片免费观看视频| 日韩精品无码免费一区二区三区| 免费人人潮人人爽一区二区 | 国产免费拔擦拔擦8X高清在线人| 亚洲精品成a人在线观看☆| 亚洲网址在线观看你懂的| 国产成人高清亚洲| 国产成人啪精品视频免费网| 久久笫一福利免费导航| 无码精品国产一区二区三区免费| 成人免费乱码大片A毛片| 无码天堂va亚洲va在线va| 亚洲欧美日韩中文高清www777| 亚洲麻豆精品果冻传媒|