国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【并發(fā)編程】無鎖環(huán)形隊(duì)列Disruptor并發(fā)框架使用

這篇具有很好參考價(jià)值的文章主要介紹了【并發(fā)編程】無鎖環(huán)形隊(duì)列Disruptor并發(fā)框架使用。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Disruptor 是蘋國外廠本易公司LMAX開發(fā)的一個(gè)高件能列,研發(fā)的初夷是解決內(nèi)存隊(duì)列的延識(shí)問顧在性能測試中發(fā)現(xiàn)竟然與10操作處于同樣的數(shù)量級(jí)),基于Disruptor開發(fā)的系統(tǒng)單線程能支撐每秒600萬訂單,2010年在QCn演講后,獲得了業(yè)界關(guān)注,201年,企業(yè)應(yīng)用軟件專家Martin Fower專門撰寫長文介紹。同年它還獲得了Oradle官方的Duke大獎(jiǎng)。目前,包括Apache StomCame、 L0g4 2在內(nèi)的很多知名項(xiàng)目都應(yīng)用了Disrupior以獲取高性能。注意,這里所說的隊(duì)列是系統(tǒng)內(nèi)部的內(nèi)存隊(duì)列,而不是Kaka這樣的分布式隊(duì)列。

前兩篇介紹了Disruptor,【數(shù)據(jù)結(jié)構(gòu)】Disruptor環(huán)形數(shù)組無鎖并發(fā)框架閱讀_wenchun001的博客-CSDN博客

【并發(fā)編程】ShenyuAdmin里面數(shù)據(jù)同步用到的無鎖環(huán)形隊(duì)列LMAX Disruptor并發(fā)框架_wenchun001的博客-CSDN博客

今天開始依次從引用包到編碼步驟說明如下

引用依賴

    <dependencies>
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.4</version>
        </dependency>
    </dependencies>

1.構(gòu)建消息載體(事件)

單生產(chǎn)者單消費(fèi)者模式
1,創(chuàng)建Event(消息載體/事件)和EventFactory (事件工廠)
2,創(chuàng)建 OrderEvent類,這個(gè)類將會(huì)被放入環(huán)形隊(duì)列中作為消息內(nèi)容。創(chuàng)建OrderEventFactory類,用于創(chuàng)建OrderEvent   事件
@Data
public class OrderEvent2 {
    private long value;
    private String name:
}
public class OrderEventFactory implements EventFactory<orderEvent> {
    @Override
    public OrderEvent newInstance()
    {
        return new OrderEvent();
    }
}

2.構(gòu)建生產(chǎn)者

創(chuàng)建 OrderEventProducer 類,它將作為生產(chǎn)者使 用

public class OrderEventProducer {
        //事件隊(duì)列
        private RingBuffer<OrderEvent> ringBuffer;
        public OrderEventProducer(RingBuffer<OrderEvent> ringBuffer)( this,ringBuffer =ringBuffer;}
        public void onData(long value,String name) {
            // 獲取事件隊(duì)列 的下一個(gè)槽
            long sequence = ringBuffer.next();
            try {
                //獲取消息 (事件)
                OrderEvent orderEvent = ringBuffer.get(sequence);
                // 寫入消息數(shù)據(jù)
                orderEvent.setValue(value):
                orderEvent.setName(name);
            }catch (Exception e){
                //異常
            }finally {
                //發(fā)布事件
                rringBuffer.publish(sequence);
            }
        }
}

3.構(gòu)建消費(fèi)者

【并發(fā)編程】無鎖環(huán)形隊(duì)列Disruptor并發(fā)框架使用,數(shù)據(jù)同步,Java面試題,軟件研發(fā),java,前端,服務(wù)器

4.生產(chǎn)消息,消費(fèi)消息的測試

【并發(fā)編程】無鎖環(huán)形隊(duì)列Disruptor并發(fā)框架使用,數(shù)據(jù)同步,Java面試題,軟件研發(fā),java,前端,服務(wù)器

    public static void main(String[] args) throws Exception {
        //創(chuàng)建disruptor
        Disruptor<OrderEvent> disruptor = new Disruptor<>(new OrderEventFactory()ringBufferSize:124 * 124
        Executors.defaultThreadFactory(), ProducerType.SINGLE,//單生產(chǎn)者
                new YieldingwaitStrategy() //等待策略
        );

        //設(shè)置消費(fèi)者用于處理RingBuffer的事件  
        disruptor.handleEventswith(new OrderEventHandler());
        //設(shè)置多消費(fèi)者,消息會(huì)被重復(fù)消費(fèi)
        //disruptor.handleEventswith(new OrderEventHandler(),new OrderEventHandler());
        //設(shè)置多消費(fèi)者 消費(fèi)者要實(shí)現(xiàn)workHandLer接口,一條消息只會(huì)被一個(gè)消費(fèi)者消費(fèi)
        //disruptor.handleEventsWithworkerPool(new OrderEventHandler(), new OrderEventHandler());

        //啟動(dòng)disruptor
        disruptor.start();
        //創(chuàng)建ringbuffer容器
        RingBuffer<OrderEvent> ringBuffer = disruptor.getRingBuffer();
        //創(chuàng)建生產(chǎn)者
        OrderEventProducer eventProducer = new OrderEventProducer(ringBuffer);// 發(fā)送消息
        for(int i=0;i<10;i++){
            eventProduceronData(i, "消息"+1);
        }
        disruptor.shutdown();
    }

多生產(chǎn)者的案例

//創(chuàng)建disruptor
        Disruptor<OrderEvent> disruptor = new Disruptor<>(new OrderEventFactory()ringBufferSize:124 * 124
        Executors.defaultThreadFactory(), ProducerType.MULIT,//多生產(chǎn)者
                new YieldingwaitStrategy() //等待策略
        );

消費(fèi)者優(yōu)先級(jí)模式


在實(shí)際場景中,我們通常會(huì)因?yàn)闃I(yè)務(wù)邏而形成一條消費(fèi)鏈,比如一個(gè)消息必須由 消費(fèi)者A->消費(fèi)者B->消費(fèi)者C 的順序依次進(jìn)行消費(fèi)。在配置消費(fèi)者時(shí),可以通過.then 方法去實(shí)現(xiàn)順序消費(fèi)。
I disruptor.handleEventswith(new OrderEventHandler())
then(new OrderEventHandler())
then(new OrderEventHandler());
handleEventsWith 與 handleEventsWithworkerPool 都是支持hen 的,它們可以結(jié)合使用。比可以按照消費(fèi)者A 消費(fèi)者B 消費(fèi)者C)->消費(fèi)者D 的消費(fèi)項(xiàng)序
1 disruptor.handleEventswith(new OrderEventHandler())
thenHandleEventsWithworkerPool(new OrderEventHandler(), new OrderEventHandler())
then(new OrderEventHandler());文章來源地址http://www.zghlxwxcb.cn/news/detail-634180.html

到了這里,關(guān)于【并發(fā)編程】無鎖環(huán)形隊(duì)列Disruptor并發(fā)框架使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Linux系統(tǒng)編程二十九】基于信號(hào)量的環(huán)形隊(duì)列生產(chǎn)消費(fèi)模型

    【Linux系統(tǒng)編程二十九】基于信號(hào)量的環(huán)形隊(duì)列生產(chǎn)消費(fèi)模型

    當(dāng)共享資源被當(dāng)成整體使用時(shí),則共享資源的數(shù)量要么是1,要么是0。 當(dāng)被訪問使用時(shí),共享資源的數(shù)量就為0,當(dāng)沒有被使用時(shí),數(shù)量就為1。 共享資源是可以被分成多份來使用的,只不過不同的線程訪問的是該共享資源的不同的區(qū)域,它是允許多個(gè)線程并發(fā)訪問的,只不過

    2024年01月22日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)—循環(huán)隊(duì)列(環(huán)形隊(duì)列)

    數(shù)據(jù)結(jié)構(gòu)—循環(huán)隊(duì)列(環(huán)形隊(duì)列)

    循環(huán)隊(duì)列是一種線性數(shù)據(jù)結(jié)構(gòu),其操作表現(xiàn)基于 FIFO(先進(jìn)先出)原則并且 隊(duì)尾被連接在隊(duì)首之后以形成一個(gè)循環(huán) 。它也被稱為“ 環(huán)形緩沖器 ”。 循環(huán)隊(duì)列的一個(gè)好處是可以利用這個(gè)隊(duì)列之前用過的空間。在一個(gè)普通隊(duì)列里,一旦一個(gè)隊(duì)列滿了,我們就不能插入下一個(gè)元素

    2024年02月11日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)】設(shè)計(jì)環(huán)形隊(duì)列

    【數(shù)據(jù)結(jié)構(gòu)】設(shè)計(jì)環(huán)形隊(duì)列

    環(huán)形隊(duì)列是一種線性數(shù)據(jù)結(jié)構(gòu),其操作表現(xiàn)基于 FIFO(先進(jìn)先出)原則并且隊(duì)尾被連接在隊(duì)首之后以形成一個(gè)循環(huán)。它也被稱為“環(huán)形緩沖器”。 環(huán)形隊(duì)列的一個(gè)好處是我們可以利用這個(gè)隊(duì)列之前用過的空間。在一個(gè)普通隊(duì)列里,一旦一個(gè)隊(duì)列滿了,我們就不能插入下一個(gè)元

    2024年02月09日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)】詳解環(huán)形隊(duì)列

    【數(shù)據(jù)結(jié)構(gòu)】詳解環(huán)形隊(duì)列

    隊(duì)列的操作算法是筆試面試中較為常見的題目。 本文將著重介紹平時(shí)面試中常見的關(guān)于隊(duì)列的應(yīng)用題目,馬上要進(jìn)行秋招了。希望對你們有幫助 _?? 設(shè)計(jì)你的循環(huán)隊(duì)列實(shí)現(xiàn)。 循環(huán)隊(duì)列是一種線性數(shù)據(jù)結(jié)構(gòu),其操作表現(xiàn)基于 FIFO(先進(jìn)先出)原則并且隊(duì)尾被連接在隊(duì)首之后以

    2024年02月10日
    瀏覽(22)
  • Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比

    Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比

    主題: 比較異步框架和同步框架在數(shù)據(jù)庫IO操作的性能差異 python版本 :python 3.8 數(shù)據(jù)庫 :mysql 8.0.27 (docker部署) 壓測工具 :locust web框架 :同步:flask 異步:starlette 請求并發(fā)量 : 模擬10個(gè)用戶 服務(wù)器配置 : Intel(R) i7-12700F 客戶端配置 :Intel(R) i7-8700 3.20GHz python中操作數(shù)據(jù)庫通常

    2024年02月08日
    瀏覽(32)
  • 環(huán)形隊(duì)列+DMA空閑中斷+接收串口數(shù)據(jù)

    本次實(shí)驗(yàn)利用環(huán)形隊(duì)列+DMA空閑中斷+串口。。通過這個(gè)實(shí)驗(yàn)可以非常深入的理解隊(duì)列,DMA,串口的知識(shí)。如果你能自己實(shí)現(xiàn)掌握這個(gè)實(shí)驗(yàn),那么你應(yīng)該基本掌握了隊(duì)列,DMA,串口的知識(shí)。 本次使用的是用環(huán)形隊(duì)列當(dāng)緩沖器區(qū)接收串口數(shù)據(jù)。我們可以先區(qū)了解DMA的空閑中斷。本次

    2024年02月13日
    瀏覽(22)
  • JUC并發(fā)編程學(xué)習(xí)筆記(九)阻塞隊(duì)列

    JUC并發(fā)編程學(xué)習(xí)筆記(九)阻塞隊(duì)列

    阻塞 隊(duì)列 隊(duì)列的特性:FIFO(fist inpupt fist output)先進(jìn)先出 不得不阻塞的情況 什么情況下會(huì)使用阻塞隊(duì)列:多線程并發(fā)處理、線程池 學(xué)會(huì)使用隊(duì)列 添加、移除 四組API 方式 拋出異常 不拋出異常,有返回值 阻塞等待 超時(shí)等待 添加 add offer put offer(E e, long timeout, TimeUnit unit) 移

    2024年02月06日
    瀏覽(25)
  • Android 并發(fā)編程--阻塞隊(duì)列和線程池

    Android 并發(fā)編程--阻塞隊(duì)列和線程池

    隊(duì)列是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進(jìn)行刪除操作,而在表的后端(rear)進(jìn)行插入操作,和棧一樣,隊(duì)列是一種操作受限制的線性表。進(jìn)行插入操作的端稱為隊(duì)尾,進(jìn)行刪除操作的端稱為隊(duì)頭。 在隊(duì)列中插入一個(gè)隊(duì)列元素稱為入隊(duì),從隊(duì)列中

    2024年02月13日
    瀏覽(32)
  • Java無鎖并發(fā)工具類Unsafe.compareAndSwapLong方法

    compareAndSwapLong 方法是一個(gè)原子操作,通常用于并發(fā)編程中的無鎖算法。它的作用是以原子方式比較并交換某個(gè)對象的一個(gè)long類型的字段。具體來說,它接收4個(gè)參數(shù): Object obj : 需要操作的對象。 long offset :? obj 中要操作的字段的內(nèi)存偏移量。 long expected : 預(yù)期的值,用于比較

    2024年02月10日
    瀏覽(18)
  • 基于無鎖循環(huán)隊(duì)列的線程池的實(shí)現(xiàn)

    基于無鎖循環(huán)隊(duì)列的線程池的實(shí)現(xiàn)

    目錄 出處:B站碼出名企路 應(yīng)用場景? 設(shè)計(jì)實(shí)現(xiàn) 等待策略模塊 晚綁定 C++ 中的?override C++中的 default C++中的 delete C++中的 explicit C++中 using 別名技巧 sleep 和 yield的區(qū)別 noexcept volatile 無鎖循環(huán)隊(duì)列的設(shè)計(jì)實(shí)現(xiàn) 原子性 內(nèi)存序 個(gè)人筆記:

    2024年01月24日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包