<xmp id="isueg"><nav id="isueg"></nav>
  • <dd id="isueg"><nav id="isueg"></nav></dd>
    <xmp id="isueg">
  • <center id="isueg"></center>
    <nav id="isueg"><code id="isueg"></code></nav>
    專注Java教育12年 全國咨詢/投訴熱線:400-8080-105

    首頁 hot資訊 高并發編程框架Disruptor之高性能設計

    高并發編程框架Disruptor之高性能設計

    更新時間:2021-08-13 11:23 來源:動力節點 瀏覽110次

    1.單線程寫

    Disruptor的RingBuffer, 之所以可以做到完全無鎖,也是因為"單線程寫",這是所有"前提的前提",離了這個前提條件,沒有任何技術可以做到完全無鎖。Redis、Netty等等高性能技術框架的設計都是這個核心思想。

    2.系統內存優化-內存屏障

    要正確的實現無鎖,還需要另外一個關鍵技術:內存屏障。對應到Java語言,就是valotile變量與happens before語義。

    3.系統緩存優化-消除偽共享

    緩存系統中是以緩存行(cache line) 為單位存儲的。緩存行是2的整數冪個連續字節,一般為32-256個字節。最常見的緩存行大小是64個字節。

    當多線程修改互相獨立的變量時,如果這些變量共享同一個緩存行,就會無意中影響彼此的性能,這就是偽共享。

    核心:Sequence

    可看成是一個AtomicLong用于標識進度。還有另外一個目的就是防止不同Sequence之間CPU緩存偽共享(Flase Sharing)的問題。 - 如下設計保證我們保存的 value 永遠在一個緩存行中。(8 個long,正好 64 字節)。這也是一個空間換時間的案例。

    4.算法優化-序號柵欄機制

    我們在生產者進行投遞Event的時候,總是會使用:

    long sequence = ringBuffer.next();

    Disruptor3.0中,序號柵欄SequenceBarrier和序號Sequence搭配使用。協調和管理消費者與生產者的工作節奏,避免了鎖和CAS的使用。

    消費者序號數值必須小于生產者序號數值

    消費者序號數值必須小于其前置(依賴關系)消費者的序號數值

    生產者序號數值不能大于消費者中最小的序號數值

    以避免生產者速度過快,將還未來得及消費的消息覆蓋

    SingleProducerSequencerPad#next

    /**
         * @see Sequencer#next(int)
         */
        @Override
        public long next(int n) // 1
        {
            if (n < 1) // 初始值:sequence = -1
            {
                throw new IllegalArgumentException("n must be > 0");
            }
            // 語義級別的
            // nextValue為SingleProducerSequencer的變量
            long nextValue = this.nextValue;
            long nextSequence = nextValue + n;
            // 用于判斷當前序號是否繞過整個 ringbuffer 容器
            long wrapPoint = nextSequence - bufferSize;
            // 用于緩存優化
            long cachedGatingSequence = this.cachedValue;
            if (wrapPoint > cachedGatingSequence || cachedGatingSequence > nextValue)
            {
                long minSequence;
                while (wrapPoint > (minSequence = Util.getMinimumSequence(gatingSequences, nextValue)))
                {
                    LockSupport.parkNanos(1L); // TODO: Use waitStrategy to spin?
                }
                this.cachedValue = minSequence;
            }
            this.nextValue = nextSequence;
            return nextSequence;
        }

    以上就是動力節點小編介紹的"高并發編程框架Disruptor之高性能設計",希望對大家有幫助,想了解更多可查看Java在線學習。動力節點在線學習教程,針對沒有任何Java基礎的讀者學習,讓你從入門到精通,主要介紹了一些Java基礎的核心知識,讓同學們更好更方便的學習和了解Java編程,感興趣的同學可以關注一下。

    提交申請后,顧問老師會電話與您溝通安排學習

    免費課程推薦 >>
    技術文檔推薦 >>

    返回頂部
    亚洲AV女人的天堂在线观看