本篇文章給大家分享的是有關Disruptor中鎖對性能有什么影響,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供湛河網(wǎng)站建設、湛河做網(wǎng)站、湛河網(wǎng)站設計、湛河網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、湛河企業(yè)網(wǎng)站模板建站服務,十年湛河做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
Disruptor是英國外匯交易公司LMAX開發(fā)的一個高性能隊列,研發(fā)的初衷是解決內(nèi)存隊列的延遲問題(在性能測試中發(fā)現(xiàn)竟然與I/O操作處于同樣的數(shù)量級)。基于Disruptor開發(fā)的系統(tǒng)單線程能支撐每秒600萬訂單,2010年在QCon演講后,獲得了業(yè)界關注。2011年,企業(yè)應用軟件專家Martin Fowler專門撰寫長文介紹。同年它還獲得了Oracle官方的Duke大獎。
目前,包括Apache Storm、Camel、Log4j 2在內(nèi)的很多知名項目都應用了Disruptor以獲取高性能。在美團技術團隊它也有不少應用,有的項目架構借鑒了它的設計機制。本文從實戰(zhàn)角度剖析了Disruptor的實現(xiàn)原理。
需要特別指出的是,這里所說的隊列是系統(tǒng)內(nèi)部的內(nèi)存隊列,而不是Kafka這樣的分布式隊列。另外,本文所描述的Disruptor特性限于3.3.4。
介紹Disruptor之前,我們先來看一看常用的線程安全的內(nèi)置隊列有什么問題。Java的內(nèi)置隊列如下表所示。
隊列 | 有界性 | 鎖 | 數(shù)據(jù)結構 |
---|---|---|---|
ArrayBlockingQueue | bounded | 加鎖 | arraylist |
LinkedBlockingQueue | optionally-bounded | 加鎖 | linkedlist |
ConcurrentLinkedQueue | unbounded | 無鎖 | linkedlist |
LinkedTransferQueue | unbounded | 無鎖 | linkedlist |
PriorityBlockingQueue | unbounded | 加鎖 | heap |
DelayQueue | unbounded | 加鎖 | heap |
隊列的底層一般分成三種:數(shù)組、鏈表和堆。其中,堆一般情況下是為了實現(xiàn)帶有優(yōu)先級特性的隊列,暫且不考慮。
我們就從數(shù)組和鏈表兩種數(shù)據(jù)結構來看,基于數(shù)組線程安全的隊列,比較典型的是ArrayBlockingQueue,它主要通過加鎖的方式來保證線程安全;基于鏈表的線程安全隊列分成LinkedBlockingQueue和ConcurrentLinkedQueue兩大類,前者也通過鎖的方式來實現(xiàn)線程安全,而后者以及上面表格中的LinkedTransferQueue都是通過原子變量compare and swap(以下簡稱“CAS”)這種不加鎖的方式來實現(xiàn)的。
通過不加鎖的方式實現(xiàn)的隊列都是無界的(無法保證隊列的長度在確定的范圍內(nèi));而加鎖的方式,可以實現(xiàn)有界隊列。在穩(wěn)定性要求特別高的系統(tǒng)中,為了防止生產(chǎn)者速度過快,導致內(nèi)存溢出,只能選擇有界隊列;同時,為了減少Java的垃圾回收對系統(tǒng)性能的影響,會盡量選擇array/heap格式的數(shù)據(jù)結構。這樣篩選下來,符合條件的隊列就只有ArrayBlockingQueue。
ArrayBlockingQueue在實際使用過程中,會因為加鎖和偽共享等出現(xiàn)嚴重的性能問題,我們下面來分析一下。
現(xiàn)實編程過程中,加鎖通常會嚴重地影響性能。線程會因為競爭不到鎖而被掛起,等鎖被釋放的時候,線程又會被恢復,這個過程中存在著很大的開銷,并且通常會有較長時間的中斷,因為當一個線程正在等待鎖時,它不能做任何其他事情。如果一個線程在持有鎖的情況下被延遲執(zhí)行,例如發(fā)生了缺頁錯誤、調度延遲或者其它類似情況,那么所有需要這個鎖的線程都無法執(zhí)行下去。如果被阻塞線程的優(yōu)先級較高,而持有鎖的線程優(yōu)先級較低,就會發(fā)生優(yōu)先級反轉。
Disruptor論文中講述了一個實驗:
這個測試程序調用了一個函數(shù),該函數(shù)會對一個64位的計數(shù)器循環(huán)自增5億次。
機器環(huán)境:2.4G 6核
運算: 64位的計數(shù)器累加5億次
Method | Time (ms) |
---|---|
Single thread | 300 |
Single thread with CAS | 5,700 |
Single thread with lock | 10,000 |
Single thread with volatile write | 4,700 |
Two threads with CAS | 30,000 |
Two threads with lock | 224,000 |
CAS操作比單線程無鎖慢了1個數(shù)量級;有鎖且多線程并發(fā)的情況下,速度比單線程無鎖慢3個數(shù)量級??梢姛o鎖速度最快。
單線程情況下,不加鎖的性能 > CAS操作的性能 > 加鎖的性能。
在多線程情況下,為了保證線程安全,必須使用CAS或鎖,這種情況下,CAS的性能超過鎖的性能,前者大約是后者的8倍。
以上就是Disruptor中鎖對性能有什么影響,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞標題:Disruptor中鎖對性能有什么影響
鏈接地址:http://muchs.cn/article10/jsojgo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、品牌網(wǎng)站建設、網(wǎng)站設計、企業(yè)網(wǎng)站制作、ChatGPT、網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)