真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Disruptor中鎖對(duì)性能有什么影響

本篇文章給大家分享的是有關(guān)Disruptor中鎖對(duì)性能有什么影響,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

創(chuàng)新互聯(lián)公司專(zhuān)業(yè)為企業(yè)提供湛河網(wǎng)站建設(shè)、湛河做網(wǎng)站、湛河網(wǎng)站設(shè)計(jì)、湛河網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、湛河企業(yè)網(wǎng)站模板建站服務(wù),十年湛河做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

Disruptor是英國(guó)外匯交易公司LMAX開(kāi)發(fā)的一個(gè)高性能隊(duì)列,研發(fā)的初衷是解決內(nèi)存隊(duì)列的延遲問(wèn)題(在性能測(cè)試中發(fā)現(xiàn)竟然與I/O操作處于同樣的數(shù)量級(jí))?;贒isruptor開(kāi)發(fā)的系統(tǒng)單線程能支撐每秒600萬(wàn)訂單,2010年在QCon演講后,獲得了業(yè)界關(guān)注。2011年,企業(yè)應(yīng)用軟件專(zhuān)家Martin Fowler專(zhuān)門(mén)撰寫(xiě)長(zhǎng)文介紹。同年它還獲得了Oracle官方的Duke大獎(jiǎng)。

目前,包括Apache Storm、Camel、Log4j 2在內(nèi)的很多知名項(xiàng)目都應(yīng)用了Disruptor以獲取高性能。在美團(tuán)技術(shù)團(tuán)隊(duì)它也有不少應(yīng)用,有的項(xiàng)目架構(gòu)借鑒了它的設(shè)計(jì)機(jī)制。本文從實(shí)戰(zhàn)角度剖析了Disruptor的實(shí)現(xiàn)原理。

需要特別指出的是,這里所說(shuō)的隊(duì)列是系統(tǒng)內(nèi)部的內(nèi)存隊(duì)列,而不是Kafka這樣的分布式隊(duì)列。另外,本文所描述的Disruptor特性限于3.3.4。

介紹Disruptor之前,我們先來(lái)看一看常用的線程安全的內(nèi)置隊(duì)列有什么問(wèn)題。Java的內(nèi)置隊(duì)列如下表所示。

隊(duì)列有界性數(shù)據(jù)結(jié)構(gòu)
ArrayBlockingQueuebounded加鎖arraylist
LinkedBlockingQueueoptionally-bounded加鎖linkedlist
ConcurrentLinkedQueueunbounded無(wú)鎖linkedlist
LinkedTransferQueueunbounded無(wú)鎖linkedlist
PriorityBlockingQueueunbounded加鎖heap
DelayQueueunbounded加鎖heap

隊(duì)列的底層一般分成三種:數(shù)組、鏈表和堆。其中,堆一般情況下是為了實(shí)現(xiàn)帶有優(yōu)先級(jí)特性的隊(duì)列,暫且不考慮。

我們就從數(shù)組和鏈表兩種數(shù)據(jù)結(jié)構(gòu)來(lái)看,基于數(shù)組線程安全的隊(duì)列,比較典型的是ArrayBlockingQueue,它主要通過(guò)加鎖的方式來(lái)保證線程安全;基于鏈表的線程安全隊(duì)列分成LinkedBlockingQueue和ConcurrentLinkedQueue兩大類(lèi),前者也通過(guò)鎖的方式來(lái)實(shí)現(xiàn)線程安全,而后者以及上面表格中的LinkedTransferQueue都是通過(guò)原子變量compare and swap(以下簡(jiǎn)稱(chēng)“CAS”)這種不加鎖的方式來(lái)實(shí)現(xiàn)的。

通過(guò)不加鎖的方式實(shí)現(xiàn)的隊(duì)列都是無(wú)界的(無(wú)法保證隊(duì)列的長(zhǎng)度在確定的范圍內(nèi));而加鎖的方式,可以實(shí)現(xiàn)有界隊(duì)列。在穩(wěn)定性要求特別高的系統(tǒng)中,為了防止生產(chǎn)者速度過(guò)快,導(dǎo)致內(nèi)存溢出,只能選擇有界隊(duì)列;同時(shí),為了減少Java的垃圾回收對(duì)系統(tǒng)性能的影響,會(huì)盡量選擇array/heap格式的數(shù)據(jù)結(jié)構(gòu)。這樣篩選下來(lái),符合條件的隊(duì)列就只有ArrayBlockingQueue。

ArrayBlockingQueue在實(shí)際使用過(guò)程中,會(huì)因?yàn)榧渔i和偽共享等出現(xiàn)嚴(yán)重的性能問(wèn)題,我們下面來(lái)分析一下。

加鎖

現(xiàn)實(shí)編程過(guò)程中,加鎖通常會(huì)嚴(yán)重地影響性能。線程會(huì)因?yàn)楦?jìng)爭(zhēng)不到鎖而被掛起,等鎖被釋放的時(shí)候,線程又會(huì)被恢復(fù),這個(gè)過(guò)程中存在著很大的開(kāi)銷(xiāo),并且通常會(huì)有較長(zhǎng)時(shí)間的中斷,因?yàn)楫?dāng)一個(gè)線程正在等待鎖時(shí),它不能做任何其他事情。如果一個(gè)線程在持有鎖的情況下被延遲執(zhí)行,例如發(fā)生了缺頁(yè)錯(cuò)誤、調(diào)度延遲或者其它類(lèi)似情況,那么所有需要這個(gè)鎖的線程都無(wú)法執(zhí)行下去。如果被阻塞線程的優(yōu)先級(jí)較高,而持有鎖的線程優(yōu)先級(jí)較低,就會(huì)發(fā)生優(yōu)先級(jí)反轉(zhuǎn)。

Disruptor論文中講述了一個(gè)實(shí)驗(yàn):

  • 這個(gè)測(cè)試程序調(diào)用了一個(gè)函數(shù),該函數(shù)會(huì)對(duì)一個(gè)64位的計(jì)數(shù)器循環(huán)自增5億次。

  • 機(jī)器環(huán)境:2.4G 6核

  • 運(yùn)算: 64位的計(jì)數(shù)器累加5億次

MethodTime (ms)
Single thread300
Single thread with CAS5,700
Single thread with lock10,000
Single thread with volatile write4,700
Two threads with CAS30,000
Two threads with lock224,000

CAS操作比單線程無(wú)鎖慢了1個(gè)數(shù)量級(jí);有鎖且多線程并發(fā)的情況下,速度比單線程無(wú)鎖慢3個(gè)數(shù)量級(jí)??梢?jiàn)無(wú)鎖速度最快。

單線程情況下,不加鎖的性能 > CAS操作的性能 > 加鎖的性能。

在多線程情況下,為了保證線程安全,必須使用CAS或鎖,這種情況下,CAS的性能超過(guò)鎖的性能,前者大約是后者的8倍。

以上就是Disruptor中鎖對(duì)性能有什么影響,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁(yè)名稱(chēng):Disruptor中鎖對(duì)性能有什么影響
本文來(lái)源:http://weahome.cn/article/jsojgo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部