自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

超越線程池:Java并發(fā)并沒有你想的那么糟糕

開發(fā) 后端
很多人一直嘮叨著并發(fā)中的新概念。然而,許多開發(fā)人員還沒有機會把過多的注意力都放在上面。在這篇文章中,我們將帶您了解Java 8 streams、 Hadoop、 Apache Spark、 Quasar fibers以及響應(yīng)式編程,讓你迅速入門。尤其是如果你不經(jīng)常用它們的話。一句話,它并不遙遠(yuǎn),它就在我們身邊。

很多人一直嘮叨著并發(fā)中的新概念。然而,許多開發(fā)人員還沒有機會把過多的注意力都放在上面。在這篇文章中,我們將帶您了解Java 8 streams、 Hadoop、 Apache Spark、 Quasar fibers以及響應(yīng)式編程,讓你迅速入門。尤其是如果你不經(jīng)常用它們的話。一句話,它并不遙遠(yuǎn),它就在我們身邊。

超越線程池:Java并發(fā)并沒有你想的那么糟糕

我們該怎么做?

談到并發(fā),一種很好的方式來形容當(dāng)前的問題是來回答幾個小問題以便更好的了解它:

它是一個數(shù)據(jù)處理任務(wù)么?如果是這樣的話,它可以分解為獨立的任務(wù)單元么?

操作系統(tǒng)、虛擬機和你的代碼之間的關(guān)系是什么?(本地線程 VS 輕量級線程)

有多少機器和處理器參與?(單核 VS 多核)

讓我們帶著問題,一起找出每個問題的最佳答案吧。

1、從線程池到并行流

在Java 8中,我們了解到新的流API接口,它允許應(yīng)用聚集操作,如篩選、排序或者映射數(shù)據(jù)流。流允許我們做的另一件事情是,在多核機器上應(yīng)用并行操作。并行流 ——通過把Fork/Join框架引入Java 7將線程間的工作分離。Java 6并發(fā)庫,我們看到了ExecutorService創(chuàng)建和處理我們的工作線程池,這不得不說是個進步。

Fork/Join也建立在ExecutorService之上,與傳統(tǒng)的線程主要的區(qū)別在于如何在線程和支持多核的機器間分配工作。用一個簡單的 ExecutorService你能完全控制工作線程之間的負(fù)載分布,確立每個任務(wù)的大小以便線程來處理。而Fork/Join,恰好有個work-stealing算法分配線程間的負(fù)載。簡而言之,這允許大型任務(wù)可以被分成更小單元,并在不同的線程間處理,最終我們可以知道——它是為了平衡線程間的 工作。然而,這并不是萬能的。

有時并行流會減慢你速度的,所以你需要多想想。在你的方法中使用parallelStream會導(dǎo)致瓶頸和減速(在我們基準(zhǔn)測試中跑慢了約15%左右)。假設(shè)我們已經(jīng)運行多個線程,在其中一些我們使用parallelStream,在線程池中添加越來越多的線程。這可以很容易超過我們的核心處理能力,由于增加了上下文轉(zhuǎn)換一切都慢下來了。

小結(jié):在單機上并行流使線程處理抽象化,在一定程度上這會均衡核心間的負(fù)載。然而,如果你想高效使用它們,記住硬件是關(guān)鍵而不是生產(chǎn)更多的線程而超出機器的處理能力。

2、Apache Hadoop和Apache Spark

接下來談多核機器、 PB級數(shù)據(jù)和任務(wù),這跟所有從twitter提到的Java或重載機器學(xué)習(xí)算法類似。談到Hadoop,不得不說這個應(yīng)用廣泛的框架及它的組 件:Hadoop分布式文件系統(tǒng)(HDFS)、資源管理平臺(YARN)、數(shù)據(jù)處理模塊(MapReduce)和其他所需的類庫和工具(Common)。 在這些組件上層還有一些其他很受歡迎的可選工具,比如運行在HDFS上的數(shù)據(jù)庫(HBase)、查詢語言平臺(Pig)和數(shù)據(jù)倉庫基礎(chǔ)結(jié)構(gòu)(Hive)。

Apache Spark 作為一種新數(shù)據(jù)處理模塊,以內(nèi)存性能和快速執(zhí)行的彈性分布式數(shù)據(jù)集(RDDs)而出名,不同于不能高效使用內(nèi)存和磁盤的Hadoop MapReduce。Databricks公布的最新標(biāo)準(zhǔn)顯示當(dāng)用少于10倍節(jié)點的時候,對1PB數(shù)據(jù)的排序Spark比Hadoop快三倍。

典型的Hadoop用例在于查詢數(shù)據(jù),而Spark正以其快速的機器學(xué)習(xí)算法越來越出名。但這只是冰山一角,Databricks如是說:“Spark 使應(yīng)用程序在Hadoop集群中運行在內(nèi)存中快100倍,當(dāng)運行在磁盤中時甚至快10倍”。

小結(jié):Spark是在Hadoop生態(tài)系統(tǒng)中的后起之秀,有一個常見的誤解是我們現(xiàn)在經(jīng)常談它一些不合作或競爭的事情,但是我認(rèn)為我們在這正在看到這個框架的發(fā)展。

3、Quasar fibers

我們有機會運行在Hadoop,現(xiàn)在讓我們回到單機。事實上,在Java多線程應(yīng)用程序和集中在單線程上,讓我們眼光再長遠(yuǎn)些。就我們而言,HotSpot JVM線程與本地系統(tǒng)線程相同,持有一個線程并且運行在”虛擬“線程中,這在fibers中都包含的。Java沒有原生的fibers支持,但是不要擔(dān) 心,Quasar通過Parallel Universe解決了我們的問題。

Quasar 是一個開源的JVM庫。它支持fibers(也稱為輕量級線程),并且還充當(dāng)框架的角色,在后面中我會提到。在這上下文轉(zhuǎn)換是它本質(zhì)的名字。當(dāng)我們核心數(shù) 量有限,一旦本地線程數(shù)量越大我們就會收到越來越多的上下文開銷。一種解決這個問題的方式是fibers,使用單線程支持”多線程“。這看起來像threadcepiton的一個實例。

Fibers還可以被視為一個從線程池的進化,當(dāng)我們通過應(yīng)用并行流的時候避開了線程過載的危險。他們更容易衡量線程和允許令人可觀的并行”輕量“線程數(shù)量。它們不是為了取代線程,而是應(yīng)該用在那些相對來說經(jīng)常堵塞的代碼中,就如同擔(dān)任真正異步線程的角色。

小結(jié):并行領(lǐng)域在Java并發(fā)性中正提供一種新的思路,雖然還沒有版本發(fā)布,但是值得一試。

4、Actor和響應(yīng)式編程

在響應(yīng)式的官方言論中,最新的釋義有4原則:響應(yīng)、有彈性、靈活性和消息驅(qū)動。這基本意味著快速、容錯、可伸縮的和支持非阻塞通信。

讓我們看看Akka Actor是如果支持它的吧。簡單來講Actor有一個狀態(tài)和一個特定的行為,通過交換消息溝通彼此的郵箱。一個Actor系統(tǒng)作為一個整體應(yīng)該被每個應(yīng) 用程序創(chuàng)建,擁有一個層次結(jié)構(gòu)將任務(wù)分解成更小的任務(wù)以便每個角色最多只有一個監(jiān)督的角色。一個角色也可以處理這個任務(wù),通過委托給另一個角色將其進一步 分解或在實例失敗的情況下,將它反饋給它的監(jiān)督者。無論哪種方式,消息不應(yīng)該包括行為或者共享可變的狀態(tài),每個角色都有一個獨立的狀態(tài)和行為。

它是一個從大多數(shù)開發(fā)者在使用的并發(fā)模型的思考模式的轉(zhuǎn)移。盡管它起源于70年代,但是為了適應(yīng)現(xiàn)代應(yīng)用程序的要求,直到最近幾年它才復(fù)蘇。并行領(lǐng)域的Quasar也支持Actor,實現(xiàn)的主要區(qū)別在于fibers/輕量級線程。

小結(jié):相反的,Actor模型需要管理線程池,讓它遠(yuǎn)離使用工具包。今天面對這種應(yīng)用程序處理的問題,尤其在我們可以處理擁有更多核心的高并發(fā)系統(tǒng)方面又重新有了關(guān)注。

總結(jié)

關(guān)于使用并發(fā)或者并行算法,我們今天通過介紹4種方法來解決問題來應(yīng)對你需要的場景。希望這有 助于激起你的興趣,以及在這大談并發(fā)話題的現(xiàn)在開拓下你的視野。超越線程池,有一種將這委托給語言及它的工具的趨勢——關(guān)注新的技術(shù)并應(yīng)用它而不是花費無 數(shù)個小時解決競態(tài)條件和鎖。

責(zé)任編輯:王雪燕 來源: ImportNew
相關(guān)推薦

2009-02-19 20:25:34

SunSolaris發(fā)展趨勢

2018-12-18 09:20:06

2022-07-11 12:37:15

安全運營網(wǎng)絡(luò)攻擊

2023-05-18 15:00:06

2016-02-15 09:52:21

虛擬現(xiàn)實

2013-01-06 13:45:14

2018-03-31 08:12:00

iPad蘋果谷歌

2009-02-17 09:11:42

Unix時間錯誤

2023-08-28 08:24:07

myloaderMySQLGreatSQL

2017-01-17 10:41:19

聯(lián)想企業(yè)網(wǎng)盤

2011-09-23 09:42:25

2020-12-14 09:35:20

CentOSRockyLinux

2020-03-24 09:00:32

企業(yè)征信信用風(fēng)險益博睿

2013-05-06 09:19:36

云應(yīng)用趨勢云服務(wù)云管理工具

2022-05-06 08:26:21

babel編譯器

2020-11-04 10:33:19

數(shù)據(jù)

2023-05-10 16:10:28

數(shù)據(jù)分析數(shù)字化轉(zhuǎn)型

2023-12-28 12:07:21

2019-10-24 08:25:44

IPv6互聯(lián)網(wǎng)網(wǎng)絡(luò)協(xié)議

2014-03-31 15:32:36

AndroidNDK開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號